Если я создаю массив указателей базового класса, создаю объект производного класса в области видимости, передаю ссылку на массив и правильно вызываю виртуальную функцию производного класса в области действия, но вне этой области я пытаюсь вызвать виртуальную функцию: забывает, что это был производный класс. Я пытался разыграть его, но это не сработало.
class Base{
public:
Base(string str) {name = str;}
virtual string toString() { return name;}
Base& operator=(const Base& b) {name = b.name; return *this;}
private:
string name;
};
class Derived: public Base{
public:
Derived(string str1, string str2) {name = str1; second = str2;}
virtual string toString() {return name + second;}
Derived& operator=(const Derived& d) {Base::operator=(d);
second = d.second; return *this;}
private:
string name;
string second;
};
int main(){
Base* baseArr[5];
int n;
cin >> n;
if(n==1){
Derived der("Derived", "Class");
baseArr[0] = &der;
baseArr[0]->toString() << endl; //this prints out "DerivedClass"}
cout << baseArr[0]->toString(); //this prints out "Derived"}
Есть ли способ вызвать функцию производного класса вне области видимости?
Вы вызываете неопределенное поведение, потому что вы ссылаетесь на экземпляр объекта через baseArr[0]
это уже было разрушено. Время жизни der
не существует за }
в конце его области, и вы не можете ссылаться на него через указатель, который вы сохранили после этой точки.
Других решений пока нет …