继承
在Java中类的继承只能是单继承,但是在C++中可以多继承
。
继承是通过一个冒号表示的,如下:
//允许多继承
class Parent
{
};
class GrandParent
{
};
//允许多继承 ,可用private或public声明继承的权限,默认private
class Child : private Parent , public GrandParent {
};
C++中的继承还可以声明继承的作用域,有private和public,默认是private
- private表示 子类只能访问父类私有的方法和变量
- public表示 父类的方法和变量子类都可以访问
如果在Child和Parent类中都实现一个签名相同的test()
方法,然后创建一个Child对象,调用child.test()
的方法,代码执行的是Child
类的test()方法,这一点和Java一致
C++中没有super.test()
这种调用父类方法的方式,如果想调用父类方法可以通过:
Parent::test()
的方式调用
代码:
class Parent
{
public:
virtual void test(){
cout << "Parent" << endl;
}
};
class Child : public Parent{
public:
void test() {
cout << "Child" << endl;
}
};
多态-静态多态
如果我们这样调用:
Parent* child = new Child();
child->test();
控制台输出结果为:
Parent
如果是Java使用类似的代码,我们输出的结果肯定是Child
,因为C++的编译的机制和Java是不一样的,这种多态的使用在C++中是一种静态多态,在编译的过程中,实例化的是一个Parent
多态-动态多态
如果上述代码执行我们想调用Child
的test()方法,就需要使用动态多态,这里需要借助C++中的虚函数,将.h头文件中Parent的test()方法用关键字virtual
修饰如下:
virtual void test(){
cout << "Parent" << endl;
}
使用虚函数需要注意的点:
- 构造方法永远不要设为虚函数
- 析构方法一般声明为虚函数
我们可以通过虚函数在父类中声明一个纯虚函数
,使用virtual
关键字声明一个函数,不做实现,子类必须实现,类似于Java中的抽象方法,比如:
//等于0表示该方法没有实现
virtual void test1() = 0;
网友评论