我正在尝试使用 c++,试图理解继承并编写了以下代码:
#include <iostream>
#include <cstdlib>
class Base1{
public:
virtual void print_hello() const
{ std::cout << "Base1: Hello!" << std::endl;}
};
class Base2{
public:
virtual void print_hello() const
{ std::cout << "Base2: Hello!" << std::endl; }
};
class Derived: public Base1, public Base2
{
public:
virtual void print_hello() const
{ std::cout << "Derived: Hello!" << std::endl; }
};
int main() {
Base1* pb1=new Derived;
pb1->print_hello();
delete pb1;
Base2* pb2=new Derived;
pb2->print_hello();
delete pb2;
return EXIT_SUCCESS;}
代码编译正常,但是当我运行它时,出现运行时错误:
Derived: Hello!
Derived: Hello!
*** glibc detected *** ./a.out: free(): invalid pointer: 0x0000000001b0c018 ***
后跟一个回溯和一个内存映射列表
两个 cout 语句都打印在屏幕上,所以我猜错误是在尝试删除 pb2 时产生的。
如果我不指定成员函数 virtual,代码运行正常。如果我在删除 pb1(即pb1=new Derived;
)后重用 pb1,而不是创建新指针 pb2,该代码也可以正常运行。我在这里想念什么?
PS:我在 Ubuntu 12.04 中使用 g++ (4.6.4) 和 icc (2013.3.163) 尝试了代码