C++11 @5

2022-02-04  本文已影响0人  Drew_MyINTYRE

类的派生和继承

Java 中虽然没有类的多重继承,但一个类可以实现多个接口,这其实也算是多重继承了。相比 Java 的这种设计,C++ 中类的多重继承太过灵活,使用时需要特别小心,否则菱形继承的问题很难避免。

class  Derived : private Base, public VirtualBase {
  // 注意,如果没有指定派生方式的话,默认为 private 方式
}

虚函数、纯虚函数和虚析构函数

Java 语言里,多态 是借助派生类重写(override)基类的函数来表达,而 抽象 则是借助抽象类(包括抽象方法)或者接口来实现。而在 C++ 中,虚函数纯虚函数 就是用于描述 多态抽象 的利器:

当我们拥有一个派生类对象(通过基类引用类型或者基类指针类型的变量实例化)来调用该对象的虚函数时,被调用的虚函数是派生类重写过的虚函数(如果该虚函数被派生类重写了的话)。

对于上面的情况,Java 是怎么样的?

//虚函数由 virtual 标示
virtual void getResult(bool isHardCode) {
    cout << "Happy new year" << endl;
}

//纯虚函数由"virtual"和"=0"同时标示
virtual void doAction(int x, int y) = 0;

Tips:

virtual ~ Father() {
   cout << "Init Father::~ Father()" << endl;
}

Father *father = new Son("WWE", 25);
...

//由于 Father 的析构函数是虚函数,所以 Son 的析构函数被调用
delete father;

// 这样就会直接调用基类的析构函数
// 运行时,~ Son()将先被调用。
father->~ Father()

在 C++ 中,也可以阻止某个虚函数被 override,方法和 Java 类似,就是在函数声明后添加 final 关键词。

// test1 将不能被派生类 override 了
virtual void test(boolean test) final;

小结:

构造和析构函数的调用次序

// 比如 Derived 派生列表中基类的顺序是:先 Base,然后是 VirtualBase。
// 所以 Base 的构造函数先于 VirtualBase 调用,最后才是 Derived 的构造函数。
class  Derived : private Base, public VirtualBase {
}
// Derived 类实例析构时,Derived 析构函数先调用,然后 VirtualBase 析构,最后才是 Base 的析构。
class  Derived : private Base, public VirtualBase {
}
上一篇下一篇

猜你喜欢

热点阅读