继承在这里是如何工作的
How is the inheritance working here?
我不确定代码是如何工作的。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
,而继承自A
,C
间接继承自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 示例中。调用虚拟函数始终调用实际对象的实现。调用普通函数 调用基于指针类型的实现。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个