【发布时间】:2020-09-30 08:14:14
【问题描述】:
我想学习虚函数。我在 Base 类中创建了 print() virtual 并且我的程序崩溃了。为什么我必须用 new 创建这两个对象?
#include <iostream>
class Base {
public:
virtual void print();
};
void Base::print() {
std::cout << "Base print method" << std::endl;
}
class Derived : public Base {
public:
void print();
};
void Derived::print() {
std::cout << "Derived print method" << std::endl;
}
int main()
{
Base* b; // Base* b = new Base(); runs
b->print();
Derived* d; // Derived *d = new Derived(); runs
d->print();
}
【问题讨论】:
-
未定义的行为!取消引用指针而不首先分配对象。
-
你有一个指针
b,但是它指向哪里? -
您的问题与虚函数无关。回顾对象指针和对象指针的区别
-
创建一个指针并不会隐式地为该指针创建一个指向的对象。
Base *b和Derived *d创建两个未初始化的指针,并且不创建任何对象让它们指向。即使访问初始化指针的值也会产生未定义的行为,更不用说尝试取消引用它(访问它指向的对象,或调用任何成员函数(即b->print())。Base *b = new Base()和Derived *d = new Derived()解决了这个问题,因为他们动态创建对象,并初始化指针,以便指向这些对象。
标签: c++ new-operator virtual-functions