C 从同一基本模板类覆盖功能,具有多个继承模棱两可的函数调用

C++ override function from same base template class with multiple inheritance ambiguous function call

本文关键字:继承 函数调用 模棱两可 功能 覆盖      更新时间:2023-10-16

我需要调用从基类派生的init(int* iNumber)函数。

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:LearningConsoleApplication4ConsoleApplication4ConsoleApplication4.cpp 14

我在这里做错了什么?我如何通过最小的更改来修复它?

此代码失败,因为C 在分辨率和访问控制检查之前执行名称查找。这是第一步是确定init类属于哪个类范围。在这种情况下,结果将是模棱两可的,因为init可以指BaseClass<int>::initBaseClass<float>::init。引入额外的using声明将将这两个功能都带入ChildClass范围:

class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public: using BaseClass<int>::init;
public: using BaseClass<float>::init;

因此,名称查找将确定init是指ChildClass::init,并且编译器将继续分辨率。

另外,您可以执行演员表(绝对不那么方便):

static_cast<BaseClass<int> *>(childClass)->init(&x);