接受 base class 类型参数的虚函数

Virtual function taking parameters of base class type

这里的多态有什么问题?

class A
{
public:
    int x;
    virtual void dosomething(const A& ob) = 0;
};

class B : public A
{
public:
    int y;
    void dosomething(const A& ob) { // I assume this will work (base class accepting a derived class by reference)
        x += ob.x;
        y += ob.y; // error: const class A has no memeber named 'y'
        cout<<x<<"    "<<y;
    }
};


int main()
{
    B s, m;
    s.x = 3;
    s.y = 9;
    m.x = 3;
    m.y = 9;

    s.dosomething(m);
}

我试过用指针代替引用,但还是不行
我应该覆盖该功能吗?

dosomething() 接受对对象 A 部分的引用。 A 没有名为 y 的成员,就像编译器错误所说的那样。只有 By 个成员。

假设还有另一个 class C 也源自 A 而不是 B,其中 C 没有 y 会员也行。如果将 C 对象传递给 B::dosomething(),您认为会发生什么情况?

class C : public A
{
public:
    int z;
    void dosomething(const A& ob) { ... }
};

B b;
C c;
b.dosomething(c);

这是行不通的。 B::dosomething() 可以接受 C 对象作为输入,但是 B::dosomething() 仍然没有 y 成员可以读取。

因此,在访问其 y 成员之前,您必须在 B::dosomething() 内部使用类型转换来检查输入 obj 是否实际上是从 B 派生的:

class B : public A
{
public:
    int y;
    void dosomething(const A& ob) {
        x += ob.x;
        const B *b = dynamic_cast<const B*>(&ob);
        if (b) y += b->y;
        cout << x << "    " << y;
    }
};