【问题标题】:call sub class method from base class specific function从基类特定函数调用子类方法
【发布时间】:2012-08-04 15:14:48
【问题描述】:

我有一个关于在 C++ 编程中处理虚函数的问题。我有这样的事情:

template<class T>
class baseClass
{
    virtual void doSomething(T& t) {
        // some baseClass specific code
    }

    void doSomethingElse(T& t) {
        // some baseClass specific code

        this->doSomething(t);
    }
}

template<class T>
class subClass
{
    virtual void doSomething(T&) {
        // some subclass related code
    }
}

现在,如果我构造一个 subClass 类型的对象......

int main(int argc, char *argv[])
{
    subClass<anyType> * subClassObject = new subClass<anyType>();
    subClassObject->doSomethingElse(anyTypeObject);
}

....调用基类的doSomethingElse方法,这个方法会调用基类的doSomething方法,而不是子类的。

我想要的是调用子类的doSomething 方法(不是baseClass)。

谁能告诉我如何做到这一点?

【问题讨论】:

  • 这段代码如何编译? subClassbaseClass 无关,也没有 doSomethingElse 方法。

标签: c++ function virtual


【解决方案1】:

你可以用CRTP来完成它:

template<class T, class Derived>
class baseClass
{    
    void doSomethingElse(T& t) {
        // some baseClass specific code
        static_cast<Derived*>(this)->doSomething(t);
    }
}

template<class T>
class subClass : public baseClass<T, subClass>
{
    void doSomething(T&) {
        // some subclass related code
    }
}

有关虚拟模板方法的讨论,请参阅this

【讨论】:

  • 感谢您的支持!如果我不必将这些函数设为虚拟,而只是通过子类覆盖 doSomething,那么 doSomethingElse 会调用 baseClass 或子类的 doSomething 吗?
  • 请注意。在我的变体中,您没有覆盖子类中的 doSomething。 baseClass 不再有 doSomething。 baseClass::doSomethingElse 可以通过普通的非虚拟调用来调用任何成员
  • 好的,我知道了!感谢您的支持。似乎是一个不错的选择。
【解决方案2】:

我对您的代码进行了几处更改以使其能够编译,并且在 g++ 4.5 中它表明正在调用子类方法。这是我编译的代码:

#include <iostream>

template<class T>
class baseClass
{
public:
    virtual void doSomething(T& t) {
        std::cout << "Base" << std::endl;
        // some baseClass specific code
    }

    void doSomethingElse(T& t) {
        // some baseClass specific code

        this->doSomething(t);
    }
};

template<class T>
class subClass : public baseClass<T>
{
    virtual void doSomething(T&) {
        std::cout << "Child" << std::endl;
        // some subclass related code
    }
};

int main()
{
    typedef int anyType;

    subClass<anyType> * subClassObject = new subClass<anyType>();
    int foo;
    subClassObject->doSomethingElse(foo);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2011-01-05
    • 2016-10-05
    • 1970-01-01
    • 2011-01-22
    • 2018-10-15
    • 2012-06-28
    相关资源
    最近更新 更多