取消隐藏派生中基类中具有相同名称和不同签名的某些函数
Unhide certain function with same name and different signature from base class in derived
class Base
{
public:
virtual void f(int)
{
printf("Base f(int)n");
}
virtual void f(int, int)
{
printf("Base f(int, int)n");
}
};
class Der : public Base
{
public:
using Base::f;
virtual void f(double)
{
printf("Der f(double)n");
}
};
因此,在这种情况下,我能够使用基类中的两个函数。但是是否可以允许在派生类中仅使用来自 base 的某些重载方法?例如,允许只使用 f(int(,而不能使用 f(int, int(。
不能
有选择地使用 using
指令取消隐藏基类方法。不幸的是,要么全有,要么全无。
这将可以:
class Der : public Base {
...
virtual void f(int p) { return Base::f(p); }
如果您担心性能,这将导致静态调度到void Base::f(int)
。
实际上,可以通过
取消隐藏所有成员然后仅隐藏特定成员(例如,通过提供私有覆盖(来仅隐藏基类中的某些成员:
struct Base
{
void f(int) {
printf("Base f(int)n");
}
void f(int, int) {
printf("Base f(int, int)n");
}
};
struct Der : Base
{
using Base::f; // unhide all f's from Base
void f(double) {
printf("Der f(double)n");
}
// hide f(int, int) from Base by declaring it as private (no implementation needed)
private:
void f(int, int);
};
void Example() {
Der der;
der.f(1); // OK Base::f(int)
der.f(1.0f); // OK Der::f(double)
der.f(1,1); // compiler error: 'f' is a private member of 'Der'
}
相关文章:
- 基类中的函数名称解析
- 如何通过派生类函数更改基类中的向量
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如果基类包含双指针成员,则派生类的构造函数
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 继承和友元函数,从基类访问受保护的成员
- 使用子类覆盖基类中定义的函数
- 如何基于模板化类的基类专门化成员函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如何在基类指针向量的元素上应用重载的多态函数
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- 在初始化列表之外手动调用基类的构造函数
- 重写打印函数而不是覆盖基类
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- C++虚拟函数:基类函数是调用的,而不是派生的
- 虚拟函数-基类指针