#include<stdio.h>
class parent
{
public:
parent()
{
}
};
class child : public parent
{
public:
child()
{
}
};
class master
{
public:
void view(parent a)
{
printf("view parent instances");
}
void view(child b)
{
printf("view child instances");
}
};
int main()
{
parent *ptr;
master mymaster;
ptr = new child;
mymaster.view(*ptr);
return 0;
}
输出:“查看父实例” 我从父类创建一个指针。然后我声明指针作为子类型。当我运行mymaster.view(* ptr); ,这总是转到第一个视图函数(void view(parent a)),如何使它转到(void view(child b))。三江源
答案 0 :(得分:3)
通过一些重构和稍微不同的方法,您可以使用virtual
函数。这使得在使用如下指针调用时可以使用派生类中的函数。
#include<stdio.h>
class parent
{
public:
parent()
{
}
virtual void view()
{
printf("View parent");
}
};
class child : public parent
{
public:
child()
{
}
virtual void view()
{
printf("View child");
}
};
class master
{
public:
void view(parent *a)
{
a->view();
}
};
int main()
{
parent *ptr;
master mymaster;
ptr = new child;
mymaster.view(ptr);
return 0;
}
这将输出“查看孩子”。没有virtual
关键字的相同代码将输出“查看父级”。请注意,关键字只需要在父类中,但为了清楚起见,通常也在派生类中使用。
虚拟函数的Wikipedia article很好地解释了这种情况:
虚拟功能“迟到”解决。如果有问题的功能是 基类中的'virtual',是派生程度最高的类的实现 根据对象的实际类型调用函数 无论指针的声明类型如何,都可以引用 参考。如果它不是“虚拟”,则该方法“早期”解决 调用的函数是根据声明的类型选择的 指针或参考。
由于此处对象的实际类型是子,因此即使指针为子的功能>父母类型。
答案 1 :(得分:0)
*(parent*)
的类型为parent
,因此被调用的方法为view(parent)
。如果要调用view(child)
,则需要将指针强制转换为child*
,然后才能传入...
你正在向后使用OOP。您没有定义多个知道如何使用每种特定类型子类的方法,您可以定义一个可以尊重父类提供的契约的方法,子类在内部做自己的事情。
答案 2 :(得分:0)
ptr
是指向parent
对象的指针。
如果要调用view(child)
函数,则需要将child
对象传递给函数调用。
或者,您可以将其强制转换为child
指针
mymaster.view(*(child*)ptr);
但你很可能会遇到各种其他问题。
答案 3 :(得分:0)
编译器根据最佳选择决定匹配方法。
编译器发现变量的类型为parent
,因此它调用匹配方法。