c++ - C++ 中的多态性(意外行为)

标签 c++ inheritance polymorphism virtual-functions

我有以下三个类:

class A
{
private:
    std::string device;
public:
    std::string getDeviceType() { return device; };
    void setDeviceType(std::string device) { device = device; };
    virtual void doSomething() = 0;
    virtual void doSomething2() = 0;
};

class B: public A
{
    private:
    public:
        B(){ ; };
        virtual ~B(){ ; };
        void doSomething() { std::cout << "I am usual B" << std::endl; };
        void virtual doSomething2() { std::cout << "I am usual B" << std::endl; };
};

class C : public B
{
private:
public:
    C(){ ; };
    ~C(){ ; };
    void doSomething() { std::cout << "I am C" << std::endl; };
    void doSomething2() { std::cout << "I am C" << std::endl; };
};

主要内容:

B *myHandler = new C();
myHandler->doSomething();
myHandler->doSomething2();

但输出不是预期的,我的预期输出是我是普通B然后是我是C,因为doSomething()B 类的非虚拟成员。但真正的输出是 I am C 然后是 I am C。你知道为什么吗?

最佳答案

because of doSomething() is non virtual member of class B

这是你弄错的地方。在 A 中,您将 doSomething() 声明为 virtual。这意味着它是 implicitly marked virtual in classes that derive from it .所以 B 中的 doSomething()virtual 这意味着您将调用 CdoSomething()

关于c++ - C++ 中的多态性(意外行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45567709/

相关文章:

c++ - 在 opencv 中创建 4x4 mat 矩阵时出错

java - 如果我的子类也有不同的方法怎么办?

c# - 如果 sibling 不能,为什么 parent 可以访问子类的 protected 成员的实例?

asp.net-mvc - 多态模型绑定(bind)

c++ - 应该接受不同输入参数的纯虚函数——应该如何实现?

c++ - 当我每秒调用它 40 次时,QListWidget::addItem() 会闪烁

c++ - 访问字符数组中不可用的内存位置(超出范围值)

c++ - 模板和 typedef 错误

python-3.x - __new__、__init__ 和元类(和父类(super class))

java - 为什么java中不允许这种downcast?