请考虑以下示例:
#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有什么用?
更新:您可能对我的另一个问题感兴趣.
我一直认为必须使用指针进行多态性.使用规范示例:
DrawEngine::render(Shape *shape)
{
shape->draw();
shape->visible(true);
}
Run Code Online (Sandbox Code Playgroud)
并将指针传递给各种Shape派生类.它与引用一样吗?
DrawEngine::render(Shape &shape)
{
shape.draw();
shape.visible(true);
}
Run Code Online (Sandbox Code Playgroud)
甚至有效:
engine.render(myTriangle); // myTriangle instance of class derived from Shape
Run Code Online (Sandbox Code Playgroud)
如果这样可行,这两种情况之间是否存在差异?我试图在Stroustrup中找到信息,但我一无所获.
我重新打开了这个,因为我想再探索一下.
所以至少有一个区别是dynamic_cast.对我来说,多态性包括使用dynamic_cast.
我可以去吗
Rhomboid & r = dynamic_cast<Rhomboid &>(shape);
Run Code Online (Sandbox Code Playgroud)
如果演员表失败会怎么样?这有什么不同吗?
Rhomboid * r = dynamic_cast<Rhomboid*>(&shape);
Run Code Online (Sandbox Code Playgroud) boost :: shared_ptr真让我烦恼.当然,我理解这种事情的实用性,但我希望我可以使用它shared_ptr<A> 作为一个A*.请考虑以下代码
class A
{
public:
A() {}
A(int x) {mX = x;}
virtual void setX(int x) {mX = x;}
virtual int getX() const {return mX;}
private:
int mX;
};
class HelpfulContainer
{
public:
//Don't worry, I'll manager the memory from here.
void eventHorizon(A*& a)
{
cout << "It's too late to save it now!" << endl;
delete a;
a = NULL;
}
};
int main()
{
HelpfulContainer helpfulContainer;
A* a1 = new A(1); …Run Code Online (Sandbox Code Playgroud)