C++ 派生类虚函数定义---注意事项
2013-07-26 17:25
316 查看
class A
{...
virtual Show(int a) const;
....
};
class B : public A
{
virtual Show()const;
}
问题:重新定义的Show()不接受任何参数,如果在派生类中重新定义函数,将不是使用相同的函数特征标覆盖基类的声明(这句话有些拗口,简言之,就是派生类B中定义的不带参数的Show(),不会覆盖基类A中定义的带参数的Show(int a)),而是将基类的带参的Show(int
a)给隐藏了!!!
这样的后果是:
B b;
b.Show() ; //合法
b.Show(6) ; //不合法!!!
从此处可引出两条规则经验:
1>如果重新定义继承的方法,应该确保与原来的原型完全相同
特殊情况:只针对返回类型是基类指针或引用的情况,则可以修改为指向派生类的指针或引用,专用术语叫返回类型协变,允许返回类型随类类型的变化而变化
class A
{
virtual
A & Show();
}
class B
{
virtual
B & Show();
}
2>如果基类声明被重载了,则应在派生类中重新定义所有的基类版本
class A
{
virtual void Show()const;
virtual void Show(int a)const;
virtual void Show(double b)const;
}
则
class B: public A
{
virtual void Show()const;
virtual void Show(int a)const;
virtual void Show(double b)const;
}
//如果只重新定义一个版本,则另外的版本将被隐藏,派生类对象将无法使用它们!!!
{...
virtual Show(int a) const;
....
};
class B : public A
{
virtual Show()const;
}
问题:重新定义的Show()不接受任何参数,如果在派生类中重新定义函数,将不是使用相同的函数特征标覆盖基类的声明(这句话有些拗口,简言之,就是派生类B中定义的不带参数的Show(),不会覆盖基类A中定义的带参数的Show(int a)),而是将基类的带参的Show(int
a)给隐藏了!!!
这样的后果是:
B b;
b.Show() ; //合法
b.Show(6) ; //不合法!!!
从此处可引出两条规则经验:
1>如果重新定义继承的方法,应该确保与原来的原型完全相同
特殊情况:只针对返回类型是基类指针或引用的情况,则可以修改为指向派生类的指针或引用,专用术语叫返回类型协变,允许返回类型随类类型的变化而变化
class A
{
virtual
A & Show();
}
class B
{
virtual
B & Show();
}
2>如果基类声明被重载了,则应在派生类中重新定义所有的基类版本
class A
{
virtual void Show()const;
virtual void Show(int a)const;
virtual void Show(double b)const;
}
则
class B: public A
{
virtual void Show()const;
virtual void Show(int a)const;
virtual void Show(double b)const;
}
//如果只重新定义一个版本,则另外的版本将被隐藏,派生类对象将无法使用它们!!!
相关文章推荐
- c++ 中默认参数的函数声明和定义的注意事项
- 派生类中重新定义虚函数及虚函数的注意事项
- 探讨:C++中函数返回引用的注意事项
- c++默认参数函数注意事项
- C++中派生类重写基类重载函数时需要注意的问题:派生类函数屏蔽基类中同名函数
- 【C++注意事项】2 变量声明和定义
- C++默认参数与函数重载 注意事项
- C++注意事项--02 函数指针用于带默认参数的函数
- C++默认参数与函数重载 注意事项
- !!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?
- iOS项目中调用C/C++库中的函数注意事项
- C++ WideCharToMultiByte函数注意事项
- 转(Dlite)LLVM IR和C/C++函数相互调用时的注意事项
- iOS项目中调用C/C++库中的函数注意事项
- C++默认参数与函数重载 注意事项
- .NET工程中以 C 和 C++ 两种方式编译时,函数调用注意事项
- C语言 函数同名宏的定义及注意事项
- C++派生类中定义基类的虚函数时需注意的事项
- 友元关系与继承以及基类派生类定义构造函数时应该注意的事项
- [C/C++标准库]_[初级]_[使用ctype里的isxxx函数时要注意的事项]