函数的虚拟性行为
Behaviour of virtualness of a function
class CBase {
public:
void print()
{
cout<<"In base print funcn";
};
};
class CDerived: public CBase {
public:
void print()
{
cout<<"In derived print funcn";
};
};
int main()
{
CBase b;
CBase* pb;
CDerived d;
CDerived* pd;
pd->print();
return 0;
}
上面的代码运行良好,但是当我在类CBase
中按virtual
制作打印函数时,它会导致分段错误。
我认为这背后有一些我不知道的基本逻辑。请给出您的意见,为什么会这样?
CDerived* pd;
pd->print();
指针未初始化 ->未定义的行为。
你需要
CDerived* pd = new CDerived;
pd->print();
此外,它运行不正常。或者更确切地说,你很不走运,它运行良好。虚拟调度需要一个虚拟表,并且由于指针未初始化,因此虚拟表指针不存在,这就是当函数为虚拟时它崩溃的原因。
当它不是虚拟的时,它仍然是未定义的行为,但它不会崩溃,因为它不使用任何成员。
要证明这一点,请尝试以下操作:
class CBase {
public:
int y;
void print()
{
cout<<"In base print funcn" << y;
};
};
class CDerived: public CBase {
public:
int x;
void print()
{
cout<<"In derived print funcn" << x;
};
};
即使功能不virtual
,它也会崩溃。
相关文章:
- 在 C++ 中将函数获取和设置为虚拟函数
- 如何将运算符重载为虚拟运算符
- C++如何抛弃函数的虚拟性并调用基本函数,而不是覆盖
- 需要WXLISTCTRL的代码更改为虚拟样式WXListCtrl的工作代码
- 如何以编程方式确定网络适配器在 Windows 上是否为虚拟适配器?
- 将继承更改为虚拟的后果?
- 在将对象声明为挥发性时,如何在C 中超载运算符
- 编译器说模板类中的方法未定义,除非我将其设为虚拟
- 在继承层次结构中将方法定义为虚拟方法一次,以使多态性发挥作用
- 为虚拟析构函数指定的冲突类型属性
- 为"虚拟无效"指定的冲突返回类型
- C++:没有虚拟性的继承
- 通过示例C++虚拟性
- 函数的虚拟性行为
- C++:由于虚拟性而导致的内存开销
- C++ 抽象类是否应该为(虚拟)析构函数提供实现
- 如何为虚拟机创建二进制文件
- 编译时检查方法是否定义为虚拟
- 传递给std::basic_string的分配器是否可以使其方法为虚拟的
- 如何指示编译器为虚拟函数生成别名