我遇到以下情况的问题:

 template<class T>
class A {
public: virtual int  f() { return 1; }
};

class BaseA : public A<BaseA> {};
class DerivedA : public BaseA, public A<DerivedA> {};


当我这样做时:

 BaseA* b1 = new DerivedA;
b1->f();


它调用A<BaseA>::f()而不是A<DerivedA>::f(),我不知道如何解决它。

最佳答案

OP中的其他信息:这是一个家庭作业问题,可以随意更改类A,但不能更改类BaseADerivedA

然后,以下是基于虚拟继承层次结构中的优势的一种解决方案:

#include <iostream>
#include <typeinfo>
using namespace std;

struct BaseA;

struct I
{
    virtual auto  f()
        -> int = 0;
};

template<class T>
class A
    : public virtual I
{
public:
    virtual auto  f()
        -> int override
    { cout << typeid( T ).name() << '\n'; return 1; }
};

template<>
class A<BaseA>: public virtual I {};

class BaseA : public A<BaseA> {};
class DerivedA : public BaseA, public A<DerivedA> {};

auto main() -> int
{
    BaseA* b1 = new DerivedA;
    b1->f();
}

关于c++ - C++调用正确的虚函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30935055/

10-10 18:11