Ваш пример кода содержит не менее 4 синтаксических ошибок, поэтому сложно судить о том, что вы пытаетесь сделать.
И логически это тоже не сработает. У вас есть класс AImpl
, который наследует A
, затем функция-член, которая принимает A
и, по-видимому, пытается динамически привести ее к AImpl
. Но это не AImpl
, потому что это просто A
, так как именно так объявляется параметр. Если вы передадите экземпляр AImpl
в эту функцию, он будет сокращен до A
.
Вы можете сделать это ссылкой или указателем на A
, а затем это может быть AImpl
. Динамические приведения используются только для ссылок или указателей.
Приведение вниз используется, когда у нас есть переменная или параметр, который имеет статический тип базового класса, но мы логически знаем, что это (или может быть) производного класса. Этого избегают везде, где это возможно, потому что это означает, что процесс компиляции не может полностью проверить правильность типа программы, т.е. ответ на вопрос «пытаетесь ли вы поместить квадратный колышек в круглое отверстие» не может быть полностью дан ответ до времени выполнения.
Обновление после редактирования вопроса
Похоже, вы хотите, чтобы клиенты вашей библиотеки имели доступ к ограниченному интерфейсу к объекту, A, но когда они передадут его функции в вашей библиотеке, у вас будет доступ к полному интерфейсу. Вы можете просто использовать friend
для этого.
class A
{
friend class LibraryThing;
void visibleToLibraryThing();
public:
// ctor, etc.
void visibleToAll();
};
class LibraryThing
{
public:
void foo(A &a)
{
a.visibleToLibraryThing();
}
};
Класс LibraryThing
может получить доступ к закрытым членам A
, поскольку он объявлен в качестве друга A
.
Недостатком является то, что LibraryThing
может получить доступ к всему в A
, поэтому это означает, что, как автор библиотеки, вы не сможете извлечь выгоду из инкапсуляции. Только пользователи вашей библиотеки.