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

Polymorphism in C++ (unexpected behaviour)

我有以下三个 classes:

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();

但输出不符合预期,我的预期输出是I am usual B然后是I am C,因为doSomething()是class[=15=的非虚拟成员].但真正的输出是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().

原因是doSomething在classA中被标记为虚拟。所以它在 classes BC 中仍然是 virtual 因为它们继承自 class A.

由于这个函数是virtual,根据对象的真实类型调用它,在你的例子中是C,你得到输出: I am C.

一旦标记为虚拟,它在所有派生中都保持虚拟 类。

在 C 中,您覆盖了 doSomething() 和 doSomething2()。你实例化了C,所以C的方法在这两种情况下都会被调用。

如果您在 C 中省略了 doSomething() 的重写,输出将如您所愿。

韩国, 梅勒