简体   繁体   English

C ++覆盖来自相同基本模板类的函数,具有多个继承模糊函数调用

[英]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>::initBaseClass<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM