继承在这里是如何工作的

How is the inheritance working here?

本文关键字:工作 何工作 在这里 继承      更新时间:2023-10-16

我不确定代码是如何工作的。A c0 = new C((;* 如何工作?如何从"C"制作指针"A"对象?

class A {
public:
    A() { print("Constructor of A"); }
    virtual ~A() { print("Destructor of A"); }
};
class B : public A {
public:
    B() { print("Constructor of B"); }
    ~B() { print("Destructor of B"); }
};
class C : public B {
public:
    C() { print("Constructor of C"); }
    ~C() { print("Destructor of C"); }
};
int main() {
    print("A* = C");
    A* c0 = new C();
    delete c0;
    print("B* = C");
    B* c1 = new C();
    delete c1;
    print("C* = C");
    C* c2 = new C();
    delete c2;
    return 0;
}

以为我很久以前就理解了继承,但现在当我需要使用它时,我只是迷失在代码中。

由于C继承自B,而继承自AC间接继承自A。因此,C的每个实例也是A的实例。因此,可以将 C* 类型的值直接转换为 A* 类型的值。

欢迎来到继承!!连续继承层次结构说出了真相。

*************************************
A Base
B Base + (Something )
C Base + (Something ) + (Something ) 
**************************************

记住像上图一样......所以现在你可以看到C包含Base,它本身绝对是A..所以这个东西对你有用..

由于 C

是从 A 派生的,因此所有 C 对象都是 (isA( A。 new 运算符创建一个 C,由于 C"isA"A,因此可以将其分配给 A* 指针。

使用 A* 指针时,只能调用在类 A 中定义的函数(因为指针类型为 A(

当您有一个指向 C 对象的 C* 指针时,您可以调用 A、B 或 C 中的任何函数(假设它们是公共的或受保护的(。

如果您有一个虚函数"f",并且

在每个类中定义了非虚函数"g",以及以下赋值:

A* pA = 新的 A;A* pAC = 新的 C;C* pC = 新的 C;

然后

pA->f(( 将调用 A::f((;pA->g(( 将调用 A::g((;

pAC->f(( 将调用 A::f((;pAC->g(( 将调用 C::g((;

pC->f(( 将调用 C::f((;pC->g(( 将调用 C::g((;

请注意,实际感兴趣的区域在 pAC 示例中。调用虚拟函数始终调用实际对象的实现。调用普通函数 调用基于指针类型的实现。