[英]C++ override function from same base template class with multiple inheritance ambiguous function call
I need to call init(int* iNumber)
function which is derived from the base class. 我需要调用从基类派生的
init(int* iNumber)
函数。
BaseClass.h BaseClass.h
#pragma once
#include "stdafx.h"
template <class T>
class BaseClass
{
public:
BaseClass() {}
virtual ~BaseClass() {}
virtual void init(T* object) = 0;
};
ChildClass.h ChildClass.h
#pragma once
#include "BaseClass.h"
class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public:
ChildClass() {}
virtual ~ChildClass() {}
};
ChildClassImpl.h 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 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 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;
}
At compile time this is gives the error 在编译时,这给出了错误
Severity Code Description Project File Line Error (active) "BaseClass<T>::init [with T=int]" is ambiguous ConsoleApplication4 d:\\Learning\\ConsoleApplication4\\ConsoleApplication4\\ConsoleApplication4.cpp 14
What am I doing wrong here? 我在这做错了什么? How could I fix it with minimal changes?
如何以最小的变化修复它?
This code fails because C++ performs name lookup before overload resolution and access control check. 此代码失败,因为C ++在重载解析和访问控制检查之前执行名称查找。 That is first step would be to determine to which class scope
init
belongs to. 第一步是确定
init
所属的类范围。 And in this case result would be ambiguous because init
could refer to either BaseClass<int>::init
or BaseClass<float>::init
. 在这种情况下,结果将是不明确的,因为
init
可以引用BaseClass<int>::init
或BaseClass<float>::init
。 Introducing an extra using
declaration will bring both of those functions into ChildClass
scope: 引入额外的
using
声明会将这两个函数带入ChildClass
范围:
class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public: using BaseClass<int>::init;
public: using BaseClass<float>::init;
So name lookup will determine that init
refers to ChildClass::init
and compiler will proceed to overload resolution. 因此名称查找将确定
init
引用ChildClass::init
并且编译器将继续进行重载解析。
Alternatively you can perform a cast (which is definitely not as convenient): 或者你可以执行演员表演(这绝对不方便):
static_cast<BaseClass<int> *>(childClass)->init(&x);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.