Функции полиморфизма C++, принимающие void *
и другие типы указателей как их аргументы: он считается неоднозначным?Функция полиморфизма C++, принимающая void * и другой тип указателя в качестве аргумента: считается ли она неоднозначной?
Я беспокоюсь, что поскольку любой указатель может быть приведен к void*
, будет ли второй вызов бара ниже выполняет 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);
Кроме того, скажем, bar
теперь виртуальные функции полиморфизм, принимая void*
аргумент как 1-й формы, и указатель базового абстрактного класса аргумент как вторая форма. Будет ли вызов с указателем производного класса в качестве аргумента выполнить 1-й или 2-й формы? То есть, будет ли указатель производного класса передан его базовому абстрактному указателю класса (и, следовательно, будет действовать 2-я форма), или будет ли он передан в void *
(и, таким образом, первая форма будет действовать) перед вызовом bar()
?
'int *' подходит лучше, чем 'void *', поэтому он будет вызываться в вашем примере, но почему вы даже используете 'void *'? –
Запишите свой полиморфизм и проверьте, что произойдет. Если вас все еще интересует *, почему это происходит, тогда опубликуйте код, который ведет себя так, как вы просите. – user2079303
@Bartek: 'void *' является общим для скрытия внутренних структур данных, таких как внутренние состояния. Вызывающий может рассматривать его как черный ящик, может передать его в качестве аргумента. –