C++如何从父调用子方法
C++ How to call a Child Method from Parent
我正在做一个小项目,我发现自己遇到了这样的情况:
class A{}
class B : class A {
public:
void f();
int getType() const;
private:
int type;
}
class C : class A{
public:
int getType() const;
private:
int type;
}
我想知道是否有办法从 type A
的对象调用 f()
函数 (in class B
)?
我试过了,但它说在 class A
中找不到函数 f()
:
int main(){
vector<A*> v;
// v initialized with values of A ...
if (v->getType() == 1){ // 1 is the type of B
v->f();
}
}
如您所见,此代码无法编译,因为 A
没有 f
方法。为了使其工作,您必须显式向下转换指针:
B* tmp = dynamic_cast<B*>(v);
tmp->f();
首先,对于您当前的 classes,您无法在 A* 上调用 getType()
。因为A的接口没有这个方法。要解决此问题,您需要在 A 中使 getType
成为虚函数,或者将 type
字段移动到基 class A(如 protected
)并在中初始化它子 classes 的构造函数。让我告诉你第一种方法,因为我认为这是一种更好的方法,因为它使这个函数的 objective 更加清晰。
class A {
public:
virtual int getType() { return 0; } // or delete the function: ... getType() = 0;
}
class B : public A {
public:
int getType() override { return 1; }
}
使用这些 classes,一旦你创建了 B 的实例,getType() returns 1 在该实例上调用时,无论它是由 A*
还是B*
:
A *object = new B();
object->getType(); // returns 1
现在,如果您需要从 B 访问 f()
,您可以再次将其作为虚方法添加到 A 的接口,或者强制转换为 B*
.
使用虚拟方法:
class A {
public:
virtual void f() { /* a default action maybe? */ }
}
class B : public A {
public:
void f() /* override if you want */ { /* whatever this function does in B */ }
}
...
for (A *ptr : v)
ptr->f();
使用演员表:
class A {
public:
virtual int getType() { return 0; }
}
class B : public A {
public:
void f();
int getType() override { return 1; }
}
...
for (A *ptr : v)
if (ptr->getType() == 1)
dynamic_cast<B*>(ptr)->f();
我正在做一个小项目,我发现自己遇到了这样的情况:
class A{}
class B : class A {
public:
void f();
int getType() const;
private:
int type;
}
class C : class A{
public:
int getType() const;
private:
int type;
}
我想知道是否有办法从 type A
的对象调用 f()
函数 (in class B
)?
我试过了,但它说在 class A
中找不到函数 f()
:
int main(){
vector<A*> v;
// v initialized with values of A ...
if (v->getType() == 1){ // 1 is the type of B
v->f();
}
}
如您所见,此代码无法编译,因为 A
没有 f
方法。为了使其工作,您必须显式向下转换指针:
B* tmp = dynamic_cast<B*>(v);
tmp->f();
首先,对于您当前的 classes,您无法在 A* 上调用 getType()
。因为A的接口没有这个方法。要解决此问题,您需要在 A 中使 getType
成为虚函数,或者将 type
字段移动到基 class A(如 protected
)并在中初始化它子 classes 的构造函数。让我告诉你第一种方法,因为我认为这是一种更好的方法,因为它使这个函数的 objective 更加清晰。
class A {
public:
virtual int getType() { return 0; } // or delete the function: ... getType() = 0;
}
class B : public A {
public:
int getType() override { return 1; }
}
使用这些 classes,一旦你创建了 B 的实例,getType() returns 1 在该实例上调用时,无论它是由 A*
还是B*
:
A *object = new B();
object->getType(); // returns 1
现在,如果您需要从 B 访问 f()
,您可以再次将其作为虚方法添加到 A 的接口,或者强制转换为 B*
.
使用虚拟方法:
class A {
public:
virtual void f() { /* a default action maybe? */ }
}
class B : public A {
public:
void f() /* override if you want */ { /* whatever this function does in B */ }
}
...
for (A *ptr : v)
ptr->f();
使用演员表:
class A {
public:
virtual int getType() { return 0; }
}
class B : public A {
public:
void f();
int getType() override { return 1; }
}
...
for (A *ptr : v)
if (ptr->getType() == 1)
dynamic_cast<B*>(ptr)->f();