相关疑难解决方法(0)

学习C++:多态和切片

请考虑以下示例:

#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有什么用?


更新:您可能对我的另一个问题感兴趣.

c++ polymorphism

54
推荐指数
2
解决办法
7083
查看次数

关于多态性的引用和指针是否相同?

我一直认为必须使用指针进行多态性.使用规范示例:

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)

c++ polymorphism reference

41
推荐指数
2
解决办法
1万
查看次数

C++:创建共享对象而不是对象的共享指针

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)

c++ pimpl-idiom smart-pointers shared-ptr

4
推荐指数
1
解决办法
606
查看次数