我是面向对象程序的新手,所以也许这是一个基本问题,但我很感激您提供的任何帮助。
如果我有一个从类A派生的类B,那么类B的对象是否有某种方法可以从类A的成员函数中访问类B的成员函数?所以在下面的例子中,如果最初调用function1的对象是B类,我可能会在function1中调用function2。这是可能的,如果是这样,我该如何实现呢?谢谢!
class A
{
public:
int a;
int b;
A(){}
A(int a, int b) { this->a = a; this->b = b; }
int function1();// { call function2 if class B }
};
class B : public A
{
public:
int c;
int d;
B(){}
B(int c, int d) { this->c = c; this->d = d; }
int function2();
};
答案 0 :(得分:4)
A
内的一个函数并不知道扩展B
的类A
存在以及它有哪些方法。
为了能够从A中调用B中实现的特定方法,您需要在A中将其声明为virtual
,可能是纯虚拟(= 0
)。
class A {
protected:
virtual void function2() = 0;
public:
void function1() { this->function2(); }
}
class B : public A {
protected:
void function2() override { ... }
}
在运行时解析virtual
方法,这意味着在调用时,将执行调用它的对象的更具体的实现。纯virtual
方法没有任何基本实现,这使得A
抽象并禁止其实例化。
编辑:最后一点,不要从基础构造函数或析构函数中调用virtual
方法。这是危险的,也是一种不好的做法,不是这是你的情况,但你永远不知道。
答案 1 :(得分:1)
是。您需要将function2()
定义为A类中的虚函数。然后,如果对象实际上是{{1},则从function1
调用它将导致调用B function2()
}}。例如:
B
如果 class A
{
public:
int a;
int b;
A(){}
A(int a, int b) { this->a = a; this->b = b; }
int function1() { return this->function2(); }
virtual int function2() { return 0; }
};
class B : public A
{
public:
int c;
int d;
B(){}
B(int c, int d) { this->c = c; this->d = d; }
int function2() override { return 999; }
};
的{{1}}没有明智的实现,那么拥有function2
对象永远不会有意义。您可以通过声明A
为纯虚拟来表达这一点; e.g。
A
答案 2 :(得分:0)
virtual允许您覆盖父类中的函数。
class A
{
public:
A(){}
A(int a, int b):a(a), b(b) {}
int function1() { return this->function2(); }
virtual int function2() { //what function2 in parent class should do }
private:
int a;
int b;
};
class B : public A
{
public:
B(){}
B(int c, int d):c(c), d(d) {}
int function2() { //what function2 in child class should do }
private:
int c;
int d;
};