用派生的类构造函数初始化对象
Initialize a object with a derived class constructor
考虑以下C 代码:
#include <iostream>
using std::cout;
class A
{
public:
int a;
A():a(0)
{
cout << "A constructorn";
}
virtual void f()
{
cout << "f inside An";
}
};
class C : public A
{
public:
int c;
virtual void f()
{
cout << "f inside Cn";
}
C():c(0)
{
cout << "C constructorn";
}
};
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
i使用C
类的构造函数初始化varA
对象。称为A和C类的构造函数,但是varA
只是一个A
对象。我将varA
的地址投放到C*
类型,然后尝试调用其f()
函数,但它打印了A
类的f()
功能,因此我推断出它是使用早期的绑定机制来调用它。我认为,如果我称之为派生类的构造函数,例如这种情况,如果我称之为基本构造函数,我会获得相同的对象。我认为唯一的区别是调用其他构造函数。我的假设是正确的还是还有其他区别?
切片的经典示例。A varA = C();
使您拥有静态和动态类型A
的对象。结果,C* varC = static_cast<C*>(&varA);
表现出未定义的行为。
您可以将完整的派生类存储在基类指针中,但是:
int main() {
A* varA = new C();
C* varC = static_cast<C*>(varA);
varC->f();
cout << "varC->a is " << varC->a << endl;
cout << "varC->b is " << varC->b << endl;
cout << "varC->c is " << varC->c << endl;
} // oops, forgot to delete varA/varC, memory leak!
相关文章:
- C++使用整数的压缩数组初始化对象
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 在 c++ 中初始化对象
- C++ 手动分配和初始化对象
- 使用运算符"="在C++中用值初始化对象
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 如何初始化对象数组?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 在 c++ 中复制对未初始化对象的引用
- 在成员变量在另一个文件中发生更改后,调用与初始化对象分开的函数
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 当您通过分配初始化C 对象时会发生什么
- 获取未初始化对象成员的地址是否定义良好?