虚拟功能签名不匹配及其行为
Virtual Function Signature Mismatch and its behavior
我正在查看虚拟函数行为的示例案例。鉴于此测试代码,我对其行为有一些问题。
class A
{
public:
A(int x)
{
cout << "In A Constructor" << endl;
print();
}
~A(){
cout << "In A Destructor" << endl;
delete _val;
}
virtual void print() { cout << "A." << endl; }
private:
char* _val;
};
class B: public A
{
public:
B(int x, int y) : A(x)
{
_dVal = new char[y];
cout << "In B Constructor 1" << endl;
print();
}
B() : A(0)
{
_dVal = new char[1];
cout << "In B Constructor 2" << endl;
print();
}
~B(){
cout << "In B Destructor" << endl;
delete _dVal;
}
void print() { cout << "B" << endl; }
private:
char* _dVal;
};
int main(int argc, char** argv) {
A* p1 = new B();
p1->print();
delete p1;
return 0;
}
输出为:
In A Constructor
A.
In B Constructor 2
B
B
In A Destructor
1)如果A类是唯一将其称为虚拟函数的级别,为什么打印为B类,并且通过删除( ->)调用它?2)为什么如果构造函数被称为构造函数,则为什么永远不会被调用?
1)如果A类是唯一将其称为虚拟函数的级别,为什么打印为B类,并且通过删除( ->)调用它?
这就是虚拟函数应该做的。指针p1
是类型A*
的,但实际上指向B
类型的对象。只有在使用指针或对基类的引用来处理派生类时,这种动态绑定才会发生。
还请注意,派生类中的覆盖函数也是虚拟的(是否在声明中使用了关键字虚拟)。
2)为什么如果构造函数被称为构造函数,为什么永远不会被调用?
B
的破坏者之所以被调用,是因为您没有声明基类的破坏者(即A::~A
)为虚拟驱动器。对于这种情况,行为是不确定的。B
的构造函数之所以称呼,是因为您通过new B()
明确构建B
。
相关文章:
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- C++ 与操作员不匹配<<
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 与'operator='不匹配(操作数类型'String'且"void")
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- RE2 不匹配非 ASCII 字符
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 虚拟功能签名不匹配及其行为
- C 功能定义和可变声明不匹配
- 功能参数与函数调用不匹配
- 与功能中的'operator=='不匹配
- 与操作员'<<'不匹配 有人可以帮助解决无效功能错误吗?[C++]
- 提升async_read_until自定义匹配功能的问题在 GCC 中不符合
- 排序功能中的'operator='不匹配