说我有三个班:
class X{}; class Y{}; class Both : public X, public Y {};
我的意思是说我有两个类,然后是第三个类,它们都扩展了(多重继承).
现在说我在另一个类中定义了一个函数:
void doIt(X *arg) { } void doIt(Y *arg) { }
我用这两个实例调用这个函数:
doIt(new Both());
这会导致编译时错误,表明函数调用不明确.
有什么情况,除了这个,C++编译器决定调用是不明确的并且抛出错误,如果有的话?编译器如何确定这些情况是什么?
简单:如果它不明确,那么编译器会给你一个错误,迫使你选择.在你的代码片段中,你会得到一个不同的错误,因为类型new Both()
是指针Both
,而两个重载都是doIt()
按值接受它们的参数(即它们不接受指针).如果你改变doIt()
采取的各类参数X*
和Y*
分别,编译器会为您提供有关暧昧函数调用错误.
如果要显式调用其中一个,则适当地转换参数:
void doIt(X *arg) { } void doIt(Y *arg) { } Both *both = new Both; doIt((X*)both); // calls doIt(X*) doIt((Y*)both); // calls doIt(Y*) delete both;
我用gcc得到这个错误:
jeremy@jeremy-desktop:~/Desktop$ g++ -o test test.cpp test.cpp: In function ‘int main(int, char**)’: test.cpp:18: error: call of overloaded ‘doIt(Both&)’ is ambiguous test.cpp:7: note: candidates are: void doIt(X) test.cpp:11: note: void doIt(Y)