仅覆盖基 class 的同名虚函数
Overriding only some virtual funtion of base class with the same name
我有一个基 class,它有一个虚函数 foo(int i)
和 foo()
(同名,不同的参数)。
派生的 class 仅覆盖 foo()
.
现在派生的 class 不再知道 foo(int i)
。
class Base
{
public:
virtual void foo(int i) {
std::cout << "Base::foo(int i)" << std::endl;
}
virtual void foo() {
std::cout << "Base::foo()" << std::endl;
};
};
class Derived : public Base
{
public:
void foo() override {
std::cout << "Derived::foo()" << std::endl;
}
};
int main(const int ac, const char* const av[])
{
Base base;
base.foo();
base.foo(42);
Derived derived;
derived.foo();
derived.foo(42);//ERROR : Function unknown
}
应该输出:
Base::foo()
Base::foo(int i)
Derived::foo()
Base::foo(int i)
问题出在哪里,解决方案是什么?
派生的 class 有时会覆盖 foo()
,有时会覆盖 foo(int i)
,有时两者都会覆盖。
备注
如果我通过基础 class 它可以工作,但这个解决方案在我的程序中并不理想:
Derived derived;
Base* pBase = &derived;
pBase->foo();
pBase->foo(42); //WORK
编辑
好的,我在geeksforgeeks.org上发现你需要在派生class中使用using Base::foo;
来导入其他foo函数。
有人知道为什么会发生什么事吗?我不想不明白一些事情。
只需在派生的 class 中添加一个 using 声明 ,如下所示。特别是,using declaration 用于 base-class 成员函数(如 foo
)将该函数的所有重载实例添加到派生的范围 class.现在,您可以覆盖采用 int
类型参数的版本,并使用 using 声明 使用在派生 class 范围中添加的其他版本的实现.
class Derived : public Base
{
public:
//added this using declaration
using Base::foo;
void foo() override {
std::cout << "Derived::foo()" << std::endl;
}
};
Working demo
上面修改后的程序输出如你所愿:
Base::foo()
Base::foo(int i)
Derived::foo()
Base::foo(int i)
我有一个基 class,它有一个虚函数 foo(int i)
和 foo()
(同名,不同的参数)。
派生的 class 仅覆盖 foo()
.
现在派生的 class 不再知道 foo(int i)
。
class Base
{
public:
virtual void foo(int i) {
std::cout << "Base::foo(int i)" << std::endl;
}
virtual void foo() {
std::cout << "Base::foo()" << std::endl;
};
};
class Derived : public Base
{
public:
void foo() override {
std::cout << "Derived::foo()" << std::endl;
}
};
int main(const int ac, const char* const av[])
{
Base base;
base.foo();
base.foo(42);
Derived derived;
derived.foo();
derived.foo(42);//ERROR : Function unknown
}
应该输出:
Base::foo()
Base::foo(int i)
Derived::foo()
Base::foo(int i)
问题出在哪里,解决方案是什么?
派生的 class 有时会覆盖 foo()
,有时会覆盖 foo(int i)
,有时两者都会覆盖。
备注
如果我通过基础 class 它可以工作,但这个解决方案在我的程序中并不理想:
Derived derived;
Base* pBase = &derived;
pBase->foo();
pBase->foo(42); //WORK
编辑
好的,我在geeksforgeeks.org上发现你需要在派生class中使用using Base::foo;
来导入其他foo函数。
有人知道为什么会发生什么事吗?我不想不明白一些事情。
只需在派生的 class 中添加一个 using 声明 ,如下所示。特别是,using declaration 用于 base-class 成员函数(如 foo
)将该函数的所有重载实例添加到派生的范围 class.现在,您可以覆盖采用 int
类型参数的版本,并使用 using 声明 使用在派生 class 范围中添加的其他版本的实现.
class Derived : public Base
{
public:
//added this using declaration
using Base::foo;
void foo() override {
std::cout << "Derived::foo()" << std::endl;
}
};
Working demo 上面修改后的程序输出如你所愿:
Base::foo()
Base::foo(int i)
Derived::foo()
Base::foo(int i)