虚函数采用基类类型的参数

时间:2015-03-07 19:20:05

标签: c++ virtual

这里的多态性有什么问题?

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

我尝试使用指针而不是引用,但仍然没有工作
我应该覆盖这个功能吗?

1 个答案:

答案 0 :(得分:4)

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

想象一下,还有另一个类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个对象作为输入,但y仍然没有B::dosomething()个成员可以阅读。

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

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;
    }
};