本文翻译自:Can I call a base class's virtual function if I'm overriding it?
Say I have classes Foo
and Bar
set up like this: 假设我有类Foo
和Bar
设置如下:
class Foo
{
public:
int x;
virtual void printStuff()
{
std::cout << x << std::endl;
}
};
class Bar : public Foo
{
public:
int y;
void printStuff()
{
// I would like to call Foo.printStuff() here...
std::cout << y << std::endl;
}
};
As annotated in the code, I'd like to be able to call the base class's function that I'm overriding. 正如在代码中注释的那样,我希望能够调用我所覆盖的基类函数。 In Java there's the super.funcname()
syntax. 在Java中,有super.funcname()
语法。 Is this possible in C++? 这在C ++中是否可行?
#1楼
参考:https://stackoom.com/question/2ouj/如果我要覆盖它-我可以调用基类的虚函数吗
#2楼
If you want to call a function of base class from its derived class you can simply call inside the overridden function with mentioning base class name(like Foo::printStuff() ). 如果要从派生类中调用基类函数,只需在提取基类名称(如Foo :: printStuff() )时调用重写函数。
code goes here 代码在这里
#include <iostream>
using namespace std;
class Foo
{
public:
int x;
virtual void printStuff()
{
cout<<"Base Foo printStuff called"<<endl;
}
};
class Bar : public Foo
{
public:
int y;
void printStuff()
{
cout<<"derived Bar printStuff called"<<endl;
Foo::printStuff();/also called the base class method
}
};
int main()
{
Bar *b=new Bar;
b->printStuff();
}
Again you can determine at runtime which function to call using the object of that class(derived or base).But this requires your function at base class must be marked as virtual. 同样,您可以在运行时确定使用该类的对象(派生或基础)调用哪个函数。但这要求您在基类中的函数必须标记为虚拟。
code below 代码如下
#include <iostream>
using namespace std;
class Foo
{
public:
int x;
virtual void printStuff()
{
cout<<"Base Foo printStuff called"<<endl;
}
};
class Bar : public Foo
{
public:
int y;
void printStuff()
{
cout<<"derived Bar printStuff called"<<endl;
}
};
int main()
{
Foo *foo=new Foo;
foo->printStuff();/this call the base function
foo=new Bar;
foo->printStuff();
}
#3楼
check this... 检查一下......
#include <stdio.h>
class Base {
public:
virtual void gogo(int a) { printf(" Base :: gogo (int) \n"); };
virtual void gogo1(int a) { printf(" Base :: gogo1 (int) \n"); };
void gogo2(int a) { printf(" Base :: gogo2 (int) \n"); };
void gogo3(int a) { printf(" Base :: gogo3 (int) \n"); };
};
class Derived : protected Base {
public:
virtual void gogo(int a) { printf(" Derived :: gogo (int) \n"); };
void gogo1(int a) { printf(" Derived :: gogo1 (int) \n"); };
virtual void gogo2(int a) { printf(" Derived :: gogo2 (int) \n"); };
void gogo3(int a) { printf(" Derived :: gogo3 (int) \n"); };
};
int main() {
std::cout << "Derived" << std::endl;
auto obj = new Derived ;
obj->gogo(7);
obj->gogo1(7);
obj->gogo2(7);
obj->gogo3(7);
std::cout << "Base" << std::endl;
auto base = (Base*)obj;
base->gogo(7);
base->gogo1(7);
base->gogo2(7);
base->gogo3(7);
std::string s;
std::cout << "press any key to exit" << std::endl;
std::cin >> s;
return 0;
}
output 产量
Derived
Derived :: gogo (int)
Derived :: gogo1 (int)
Derived :: gogo2 (int)
Derived :: gogo3 (int)
Base
Derived :: gogo (int)
Derived :: gogo1 (int)
Base :: gogo2 (int)
Base :: gogo3 (int)
press any key to exit
the best way is using the base::function as say @sth 最好的方法是使用base :: function作为@sth
#4楼
Yes you can call it. 是的,你可以打电话给它。 C++ syntax for calling parent class function in child class is 用于在子类中调用父类函数的C ++语法是
class child: public parent {
// ...
void methodName() {
parent::methodName(); // calls Parent class' function
}
};
Read more about function overriding . 阅读有关函数覆盖的更多信息。
#5楼
Sometimes you need to call the base class' implementation, when you aren't in the derived function...It still works: 有时你需要调用基类的实现,当你不在派生函数中时...它仍然有效:
struct Base
{
virtual int Foo()
{
return -1;
}
};
struct Derived : public Base
{
virtual int Foo()
{
return -2;
}
};
int main(int argc, char* argv[])
{
Base *x = new Derived;
ASSERT(-2 == x->Foo());
//syntax is trippy but it works
ASSERT(-1 == x->Base::Foo());
return 0;
}
#6楼
Yes, 是,
class Bar : public Foo
{
...
void printStuff()
{
Foo::printStuff();
}
};
It is the same as super
in Java, except it allows calling implementations from different bases when you have multiple inheritance. 它与Java中的super
相同,除了它允许在有多个继承时从不同的基础调用实现。
class Foo {
public:
virtual void foo() {
...
}
};
class Baz {
public:
virtual void foo() {
...
}
};
class Bar : public Foo, public Baz {
public:
virtual void foo() {
// Choose one, or even call both if you need to.
Foo::foo();
Baz::foo();
}
};