请考虑以下示例:
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void makeSound() {cout << "rawr" << endl;}
};
class Dog : public Animal
{
public:
virtual void makeSound() {cout << "bark" << endl;}
};
int main()
{
Animal animal;
animal.makeSound();
Dog dog;
dog.makeSound();
Animal badDog = Dog();
badDog.makeSound();
Animal* goodDog = new Dog();
goodDog->makeSound();
}
Run Code Online (Sandbox Code Playgroud)
输出是:
rawr
bark
rawr
bark
Run Code Online (Sandbox Code Playgroud)
但我认为产量肯定应该是"粗树皮树皮".badDog有什么用?
更新:您可能对我的另一个问题感兴趣.
我遇到了一个问题,即派生到派生类会解决问题.我在SO上找到了一个答案,说它可以导致UB,测试它,它编译和正常工作.是不确定的行为?如果这是解决这个问题的正确方法?
class A
{
public:
A(){};
~A(){}
};
class B : public A
{
public:
B(){};
~B(){}
void Show() { std::cout << "Show" << std::endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B* b = static_cast<B*>(&a);
b->Show();
return 0;
}
Run Code Online (Sandbox Code Playgroud)