我如何调用父函数从一个派生类使用c++ ?例如,我有一个类叫parent,还有一个类叫child,它是从parent派生的。在 每个类都有一个打印函数。在child的print函数的定义中,我想调用parents的print函数。我该怎么做呢?
当前回答
给定一个名为parent的父类和一个名为child的子类,你可以这样做:
class Parent {
public:
virtual void print(int x);
};
class Child : public Parent {
void print(int x) override;
};
void Parent::print(int x) {
// some default behavior
}
void Child::print(int x) {
// use Parent's print method; implicitly passes 'this' to Parent::print
Parent::print(x);
}
注意Parent是类的实际名称,而不是关键字。
其他回答
给定一个名为parent的父类和一个名为child的子类,你可以这样做:
class Parent {
public:
virtual void print(int x);
};
class Child : public Parent {
void print(int x) override;
};
void Parent::print(int x) {
// some default behavior
}
void Child::print(int x) {
// use Parent's print method; implicitly passes 'this' to Parent::print
Parent::print(x);
}
注意Parent是类的实际名称,而不是关键字。
如果你的基类叫base,你的函数叫FooBar(),你可以直接使用base::FooBar()调用它
void Base::FooBar()
{
printf("in Base\n");
}
void ChildOfBase::FooBar()
{
Base::FooBar();
}
我冒着风险说一句显而易见的话:你调用函数,如果它是在基类中定义的,它就会自动在派生类中可用(除非它是私有的)。
如果在派生类中存在具有相同签名的函数,可以通过在基类的名称后面加上两个冒号base_class::foo(…)来消除歧义。您应该注意到,与Java和c#不同,c++没有“基类”(super或base)的关键字,因为c++支持多重继承,这可能会导致歧义。
class left {
public:
void foo();
};
class right {
public:
void foo();
};
class bottom : public left, public right {
public:
void foo()
{
//base::foo();// ambiguous
left::foo();
right::foo();
// and when foo() is not called for 'this':
bottom b;
b.left::foo(); // calls b.foo() from 'left'
b.right::foo(); // call b.foo() from 'right'
}
};
顺便说一句,你不能直接从同一个类派生两次,因为没有办法引用一个基类而不是另一个基类。
class bottom : public left, public left { // Illegal
};
在MSVC中,有一个微软特定的关键字:__super
MSDN: 允许您显式声明正在为要重写的函数调用基类实现。
// deriv_super.cpp
// compile with: /c
struct B1 {
void mf(int) {}
};
struct B2 {
void mf(short) {}
void mf(char) {}
};
struct D : B1, B2 {
void mf(short) {
__super::mf(1); // Calls B1::mf(int)
__super::mf('s'); // Calls B2::mf(char)
}
};
struct a{
int x;
struct son{
a* _parent;
void test(){
_parent->x=1; //success
}
}_son;
}_a;
int main(){
_a._son._parent=&_a;
_a._son.test();
}
参考例子。
推荐文章
- 为什么STL如此严重地基于模板而不是继承?
- 查找当前可执行文件的路径,不包含/proc/self/exe
- 如何在Objective-C中声明类级属性?
- 面向方面编程与面向对象编程
- 未定义对静态constexpr char的引用[]
- super()失败,错误:TypeError "参数1必须是类型,而不是classobj"当父不继承对象
- 在c++中,restrict关键字是什么意思?
- c++中类似于java的instanceof
- include_directories和target_include_directories在CMake中的区别是什么?
- std::make_pair与std::pair的构造函数的目的是什么?
- 如何追加一个字符到std::字符串?
- 为什么要在c++中使用嵌套类?
- 如何处理11000行c++源文件?
- 使用g++编译多个.cpp和.h文件
- 如何在c++中追加文本到文本文件?