Я не могу вызвать частные методы производного класса, используя указатель на базовый класс, возвращенный методом Factory.
Я хотел бы вернуть unique_ptr
для Cat, когда пользователь работает на WIN и unique_ptr
собаке, когда пользователь работает на Linux.
Base.h чистый виртуальный класс
#include <iostream>
#include <memory>
class Base
{
public:
virtual void echo() = 0;
};
Cat.h - производный класс База
#include "Base.h"
class Cat : public Base
{
public:
void echo();
void CatPrivateFunction();
};
Кат. cpp
#include "Cat.h"
void Cat::echo()
{
std::cout << "In echo()" << std::endl;
}
void Cat::CatPrivateFunction()
{
std::cout << "In CatPrivateFunction()" << std::endl;
}
Dog.h - производный класс Base
#include "Base.h"
class Dog
{
void echo();
void DogPrivateFunction();
};
Dog. cpp
#include "Dog.h"
void Dog::echo()
{
std::cout << "In echo()" << std::endl;
}
void Dog::DogPrivateFunction()
{
std::cout << "In DogPrivateFunction()" << std::endl;
}
BaseFactory.h
#ifdef _WIN32
#include "Cat.h"
#elif __linux__
#include "Dog.h"
#endif
#include <memory>
class BaseFactory
{
public:
static std::unique_ptr<Base> createBase();
};
BaseFactory. cpp
#include "BaseFactory.h"
std::unique_ptr<Base> BaseFactory::createBase()
{
#ifdef __linux__
return std::unique_ptr<Base>(new Dog{});
#elif _WIN32
return std::unique_ptr<Base>(new Cat{});;
#endif
}
В следующем сценарии
#include "BaseFactory.h"
int main()
{
std::unique_ptr<Base> p = BaseFactory::createBase();
p->echo();
p->CatPrivateFunction();
return 0;
}
Я ожидаю следующий вывод
In echo ()
In CatPrivateFunction ()
Но p->CatPrivateFunction()
не работает, так как Base.h не имеет CatPrivateFunction()
функции-члена.
Как это можно сделать?