gpt4 book ai didi

c++ - 使用派生类构造函数初始化对象

转载 作者:太空宇宙 更新时间:2023-11-04 16:02:26 25 4
gpt4 key购买 nike

考虑以下 C++ 代码:

#include <iostream>

using std::cout;

class A
{
public:
int a;

A():a(0)
{
cout << "A constructor\n";
}

virtual void f()
{
cout << "f inside A\n";
}
};

class C : public A
{
public:
int c;

virtual void f()
{
cout << "f inside C\n";
}

C():c(0)
{
cout << "C constructor\n";
}
};

int main()
{
A varA = C();

cout << "Size of C class: " << sizeof(C) << "\n";
cout << "Size of varA object: " << sizeof(varA) << "\n";

C* varC = static_cast<C*>(&varA);
varC->f();

cout << "varC->a is " << varC->a << "\n";
cout << "varC->c is " << varC->c << "\n";
}

这个程序的输出是:

A constructor
C constructor
Size of C class: 16
Size of varA object: 8
f inside A
varC->a is 0
varC->c is 1726166356

我用 C 类的构造函数初始化 varA 对象。调用了 A 和 C 类的构造函数,但是 varA 只是一个 A 对象。我将 varA 的地址转换为 C* 类型,并尝试调用它的 f() 函数,但它打印出 f ()A 的函数,所以我推断它是使用早期绑定(bind)机制来调用它。我想如果我调用派生类的构造函数,就像这种情况,如果我调用了基类构造函数,我将获得相同的对象。我认为唯一的区别是调用了其他构造函数。我的推测是否正确,或者有什么不同?

最佳答案

切片的经典例子。 A varA = C();为您留下 A 的静态和动态类型的对象.结果,C* varC = static_cast<C*>(&varA);表现出未定义的行为。

关于c++ - 使用派生类构造函数初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41145496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com