Базовый класс специально объявляет метод не виртуальным. Работает в Visual Studio 2008,2010 и 2012 и whatever compiler ideone uses (gcc 4.7+?).C++: Можно ли объявить метод виртуальным в производном классе, если он не был виртуальным в базе?
#include <iostream>
class sayhi
{
public:
void hi(){std::cout<<"hello"<<std::endl;}
};
class greet: public sayhi
{
public:
virtual void hi(){std::cout<<"hello world"<<std::endl;}
};
int main()
{
greet noob;
noob.hi(); //Prints hello world
return 0;
}
Это тоже работает - метод является частным и невиртуальном в базовом классе:
#include <iostream>
class sayhi
{
private:
void hi(){std::cout<<"hello"<<std::endl;}
};
class greet: public sayhi
{
public:
virtual void hi(){std::cout<<"hello world"<<std::endl;}
};
int main()
{
greet noob;
noob.hi(); //Prints hello world
return 0;
}
Мои вопросы:
- Законно ли это?
- Почему это работает?
+1 за правильный ответ и отличный пример – franji1