C++:当方法在基类中不是虚拟时,在派生类中声明该方法 virtual 是否合法?
C++: Is it legal to declare a method virtual in a derived class when it wasn't virtual in the base?
基类明确声明该方法为非虚拟方法。它适用于Visual Studio 2008,2010和2012以及IDONE使用的任何编译器(gcc 4.7+?
#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 .合法吗?
是的。
阿拉伯数字。为什么有效?
没有什么可以阻止您在与基类的成员函数同名的派生类中声明成员函数。派生类中的函数将仅隐藏基类的函数。顺便说一下,如果派生类中的函数恰好是virtual
,那么子类可能会覆盖它:
class howdy : public greet
{
public:
// Overrides greet::hi()
virtual void hi() { std::cout << "howdy world" << std::endl; }
};
但是,这不会以任何方式影响sayhi::hi()
:特别是,在隐藏它的派生类中仅存在virtual
函数并不能使其virtual
。因此,在通过指针或对基类实例的引用调用函数时,不能期望虚拟调度工作 sayhi
:
sayhi noob;
noob.hi(); // Will NOT print "hello world"!
greet gentleman;
sayhi* p = &gentleman;
p->hi(); // Will NOT print "hello world"!
howdy neighbor;
p = &neighbor;
p->hi(); // Will NOT print "howdy"!
greet* pG = &neighbor;
pG->hi(); // WILL print "howdy"!
这是
合法的。从那一刻起,该方法在 greet
的派生类中变得virtual
。
基类方法是隐藏的(就像非virtual
一样(。
通过greet
指针调用该方法将动态解析调用。通过sayhi
调用它将静态解析它。
举个例子:
class sayhi
{
public:
void hi(){std::cout<<"hello"<<std::endl;}
};
class greet: public sayhi
{
public:
virtual void hi(){std::cout<<"hello world"<<std::endl;}
};
class greetuniverse: public greet
{
public:
virtual void hi(){std::cout<<"hello universe"<<std::endl;}
};
以下
sayhi* p = new greetuniverse;
p->hi();
将打印hello
,因为hi
在sayhi
中不是虚拟的。然而
greet* p = new greetuniverse;
p->hi();
将打印hello universe
,因为该方法是动态调用的。
这是
合法的。通过将派生类中的函数命名为 virtual,您是在运行时告诉编译器在转到基类之前检查派生类的方法以实现函数。
相关文章:
- 将子类方法声明为基类的友元
- 模板中的模板方法 - 实例声明和类方法声明签名不同
- C++ C# 中的方法声明
- 使用gtest将所有方法声明为virtual以进行mocking
- 方法声明 c++ 后的引用符号
- 标题C 中的静态类方法声明
- 接口定义中的方法声明
- 如何在没有显式方法声明的情况下返回值
- C 类方法声明返回错误
- C++ dll 导入 VBA(Excel) 与方法声明"_Something"
- 查找没有定义的方法声明
- 只要调用的函数是用constexpr指定的,就将委托方法声明为constexpr
- mat类opencv中的begin()方法声明
- C++受模板方法声明影响的名称查找
- 我可以在Visual Studio 2012中将方法声明为朋友吗?
- 类中方法声明的顺序是否对编译器很重要
- 静态方法声明但未定义错误c++
- 错误:在类方法声明中无效地使用void表达式
- 奇怪的c++语法方法声明
- 类方法声明中的 decltype:在声明成员之前使用时出错"referenced"