C++ C++;使用多继承模糊函数调用重写同一基模板类中的函数
我需要调用从基类派生的C++ C++;使用多继承模糊函数调用重写同一基模板类中的函数,c++,c++11,multiple-inheritance,ambiguous,name-lookup,C++,C++11,Multiple Inheritance,Ambiguous,Name Lookup,我需要调用从基类派生的init(int*iNumber)函数 基类.h #pragma once #include "stdafx.h" template <class T> class BaseClass { public: BaseClass() {} virtual ~BaseClass() {} virtual void init(T* object) = 0; }; ChildClassImpl.cpp #include "stdafx.h" #i
init(int*iNumber)
函数
基类.h
#pragma once
#include "stdafx.h"
template <class T>
class BaseClass
{
public:
BaseClass() {}
virtual ~BaseClass() {}
virtual void init(T* object) = 0;
};
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;
}
#包括“stdafx.h”
#包括
#包括“ChildClassImpl.h”
ChildClassImpl::ChildClassImpl(){}
ChildClassImpl::~ChildClassImpl(){}
void ChildClassImpl::init(int*iNumber)
{
Std::CUT> P>此代码失败,因为C++在超载分辨率和访问控制检查之前执行名称查找。第一步是确定哪个类作用域<代码> > < /COD> >。在这种情况下,结果将是模糊的,因为<代码> init < /C> >可以指<代码> BaseClass:init < /C> >或<代码> BaseClass::它
。使用声明引入额外的,将把这两个函数都纳入ChildClass
范围:
class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public: using BaseClass<int>::init;
public: using BaseClass<float>::init;
将使用基类::init;使用基类::init;
放在ChildClass
声明的某个地方,您从ChildClassImpl::init
函数编写的输出告诉我,您不应该拥有这些函数。相反,它们的功能应该放在实际的构造函数中。@SPD:公平地说,这是一个小问题演示这个问题的例子,而不是一个好程序设计的广告。谢谢@ PioTrSkoTwiti。它确实有用。如果你能解释为什么会发生这样的事情,那就更好了。为什么编译器不能找出正确的基类?这是一个弱点,预模板C++的分辨率规则基本上说基本方法是自动的。LLY只在名称上提升/冲突,并且不考虑参数。好处是这允许派生类用另一个签名来屏蔽两种方法。使用手动地促进两种方法使用<代码>允许适当的过载解决方案进入,但是如果您有很多方法来处理此行为,则不是帮助。示例显示了我喜欢的模板用法,但不适合以前的语言,因为这两个基类必须显式命名。感谢@VTT的解析和解释。
#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;
}
#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
class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public: using BaseClass<int>::init;
public: using BaseClass<float>::init;
static_cast<BaseClass<int> *>(childClass)->init(&x);