void *
およびその他のポインター型を引数として取る C++ ポリモーフィズム関数: あいまいと見なされますか?
任意のポインターを にキャストできるため、以下のプログラムで期待される の代わりにvoid*
以下の bar の 2 回目の呼び出しが実行されるのではないかと心配していますか?void bar(void*)
void bar(int*)
g++ でテストしたところ、期待どおりに動作しました (つまり、int* は void* にキャストされません)。しかし、C++ 言語仕様に関して、この質問にコメント/回答できる人はいますか?
foo.h:
class Foo {
public:
void bar(void *);
void bar(int *);
};
main.cpp:
...
struct A *p1;
int *p2;
Foo foo;
...
foo.bar(p1);
foo.bar(p2);
さらに、たとえば、 第 1 形式として引数を取り、第 2 形式として基本抽象クラス ポインター引数をbar
取る仮想ポリモーフィズム関数になりました。void*
派生クラス ポインタを引数として呼び出した場合、第 1 形式と第 2 形式のどちらが実行されますか? つまり、派生クラス ポインターは、その基本抽象クラス ポインターにキャストされますか (したがって、2 番目のフォームが実行されます)、またはvoid *
呼び出し前にキャストされます (したがって、1 番目のフォームが実行されます) bar()
?