私はinit(int* iNumber)
関数を呼び出す必要があります。これは基本クラスから派生したものです。C++オーバーライド機能同じベーステンプレートクラスから多重継承を使用して曖昧な関数呼び出し
BaseClass.h
#pragma once
#include "stdafx.h"
template <class T>
class BaseClass
{
public:
BaseClass() {}
virtual ~BaseClass() {}
virtual void init(T* object) = 0;
};
ChildClass.h
#pragma once
#include "BaseClass.h"
class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public:
ChildClass() {}
virtual ~ChildClass() {}
};
ChildClassImpl.h
#pragma once
#include "ChildClass.h"
class ChildClassImpl : public ChildClass
{
public:
ChildClassImpl();
virtual ~ChildClassImpl();
private:
void init(int* iNumber) override;
void init(float* fNumber) override;
};
ChildClassImpl.cpp
#include "stdafx.h"
#include <iostream>
#include "ChildClassImpl.h"
ChildClassImpl::ChildClassImpl(){}
ChildClassImpl::~ChildClassImpl(){}
void ChildClassImpl::init(int* iNumber)
{
std::cout << "Integer constructor: " << *iNumber << std::endl;
}
void ChildClassImpl::init(float* fNumber)
{
std::cout << "Float constructor: " << *fNumber << std::endl;
}
MainClass
#include "stdafx.h"
#include <iostream>
#include "ChildClassImpl.h"
using namespace std;
int main()
{
ChildClass* childClass = new ChildClassImpl();
int x = 10;
childClass->init(&x);
cout << "Test" << endl;
getchar();
return 0;
}
コンパイル時にこれがあると、エラーに
Severity Code Description Project File Line Error (active) "BaseClass<T>::init [with T=int]" is ambiguous ConsoleApplication4 d:\Learning\ConsoleApplication4\ConsoleApplication4\ConsoleApplication4.cpp 14
を与える私はここで間違って何をしているのですか?私はそれを最小限の変更でどのように修正できますか?
入れ '::のinit; BaseClassのを使用して::のinit;' 'どこかChildClass'の宣言では –
'ChildClassImpl :: init'関数から出力した出力は、それらの関数を持つべきではないことを示しています。代わりに、それらの機能を*実際の*コンストラクタに入れる必要があります。 –
@ SPD:公正であるために、それは良いプログラムデザインの広告ではなく、その問題を示す小さな例です。 –