簡體   English   中英

C ++調用正確的虛函數

[英]C++ calling the right virtual function

我遇到以下情況的問題:

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

以下程序從派生A調用f(輸出:派生中的f)。 工作正常..這里有什么問題嗎?

#include <iostream>
using namespace std;

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

class BaseA : public A<BaseA>
{
  public:
  virtual int f()
  {
   cout << "f in base" << endl;
   return 1;
  }
};

class DerivedA :  public BaseA, public A<DerivedA>
{
   public:
   int f()
   {
       cout << "f in derived" << endl;
       return 1;
    }
};

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM