如何从基类方法调用派生类的方法而不使其成为虚拟?

时间:2014-10-21 06:40:14

标签: c++

如果不使虚拟基本方法,我该如何做?

class Base {
public:
    bool foo() const;
}

class Derived : public Base{
public:
    bool foo() const;
}

3 个答案:

答案 0 :(得分:2)

从基类的isEmpty调用派生类的isEmpty没有任何意义,因为基类对其派生类一无所知。考虑到基类是单一的,而可以有许多派生类。那么派生类你将调用函数isEmpty?

在派生类中调用基类的isEmpty是有意义的。它可以通过以下方式完成

bool Derived::isEmpty() const
{
   return Base::isEmpty();
}

答案 1 :(得分:1)

你做不到。这就是virtual个关键字的原因。如果您的班级禁止使用此关键字,我宁愿不将其作为学习OOP的起点。

答案 2 :(得分:0)

如果确实需要这个,可以在基类实例中存储带有foo签名的函数的空指针,并使用基本实现直到此指针为空。然后,您可以在派生类中更改此指针,并将关联与您的派生实现相关联。然后你的基类可以通过指针调用该函数。

下面是一些示意代码:

class Base {
public:
    bool foo() const {
        if (NULL == internalFoo) {
            // base implementation;
        } else {
           return internalFoo();
        }
    }

private:
    bool (*internalFoo)() = NULL;
}

class Derived : public Base{
public:
    bool foo() const;
}