C++调用超类
C++ calling super class
我主要是一名Java和AS3程序员,但现在我正在C++中工作,偶然发现了一个问题。我有一个基类(我们称之为ClassA),它有一个私有变量var1。在这个类中,我有一个方法getVar1(),它返回一个指向该变量的指针。
接下来,我有另一个扩展Base的类(让我们称之为ClassB)。如何从超类中调用getVar1()?在java中,它就像this.var1=super.getVar1().一样简单
我读到它类似于var1=ClassA::getVar1(),但我不确定这是否适用于处理变量(也就是指针可以更改)。
谢谢。
可以将其称为ClassA::getVar1()。
但是,如果您想要java方式,您可以将该方法设置为"虚拟"。这意味着无论何时编写getVar1(),它都不取决于您在它前面编写的Type(所以在编译时),而是取决于您调用它时(在运行时)对象的类型。出于这个原因,c++保留了一个内部v表来查找合适的方法。它相当于java方式,称为后期绑定。
getVar1()
应该足够
class ClassB : public ClassA
{
...
void foo() { yourvartype* v = getVar1(); ... }
};
如果OTOH在ClassB
中定义了另一个getVar1()
,则应使用ClassA::getVar1()
来帮助编译器确定要调用的函数。
下面是一个小例子,展示了发生的情况:-A将x初始化为10-B将x初始化为20下面你可以看到虚拟函数调用是如何工作的,以及调用你的父函数是如何工作(即使你初始化的值不同)
最需要记住的是,即使你调用了你的超级函数(A::GetX),它仍然使用你自己类的值(B::x)
class A
{
public:
A::A() : x(10) {}
virtual int GetX() {return x*2;}
protected:
int x;
};
class B : public A
{
public:
B::B() : A()
{
x = 20;
}
virtual int GetX() {return x;}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a1 = new A();
B* b1 = new B();
int test1 = a1->GetX(); // returns 20 (because x is 10, but function doubles value)
int test2 = b1->GetX(); // returns 20 (because x is initialized at 20)
return 0;
}
现在,如果我们将B::GetX更改为:
virtual int GetX() {return A::GetX();}
我们得到以下结果:
int _tmain(int argc, _TCHAR* argv[])
{
A* a1 = new A();
B* b1 = new B();
int test1 = a1->GetX(); //returns 20 (as previously)
int test2 = b1->GetX(); // return 40 (x is initialized by B at 20, but then the
// A:GetX is called, which doubles the result)
return 0;
}
相关文章:
- 在从给定超类继承的所有类上调用虚函数
- 按值将对象传递给 SubClass 构造函数,导致超类的构造函数不调用
- 将 void* 强制转换为多个继承类的超类不会调用正确的方法
- 我可以从我的超类调用子类构造函数吗?
- C++ 如何使用一个参数从派生类构造函数中调用具有两个参数的超类构造函数
- 如何在 c++ 中从模板基类的构造函数调用模板超类的构造函数?
- 子类/超类的"无匹配函数调用"
- 从构造函数的主体调用超类构造函数
- 调用超类函数继承 c++
- C ++如何使用子类调用函数,具有超类指针
- 在子类的构造函数中调用超类的构造器两次
- 超类和子类,不同的函数调用取决于子类
- 调用子重写时,始终调用超类虚拟函数
- C++调用同一虚拟函数的超类函数
- C++调用模板化超类的继承方法
- 从超类调用子类的方法
- 为什么超类 B 调用子类 A 的方法?
- 超类调用子类方法的STL迭代器
- 从vector的超类调用子类方法
- 从超类调用子类方法