Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不理解多态函数_C++_Pointers_Polymorphism - Fatal编程技术网

C++ 不理解多态函数

C++ 不理解多态函数,c++,pointers,polymorphism,C++,Pointers,Polymorphism,我试图创建一个对象数组,其类“全部继承自基类”。因为我在使用Python之后刚刚学习C++,这是我第一次遇到对象切片。从我所读到的内容来看,我应该使用指向对象的指针,而不是对象本身的实例,但我似乎无法让它工作 例如,为什么此程序会输出: 1. 1. 而不是: 1. 二, #包括 甲级{ 公众: int getNumber(){ 申报表(1); } }; B类:公共A{ 公众: int getNumber(){ 返回(2); } }; int _tmain(int argc,_TCHAR*argv

我试图创建一个对象数组,其类“全部继承自基类”。因为我在使用Python之后刚刚学习C++,这是我第一次遇到对象切片。从我所读到的内容来看,我应该使用指向对象的指针,而不是对象本身的实例,但我似乎无法让它工作

例如,为什么此程序会输出: 1. 1. 而不是: 1. 二,

#包括
甲级{
公众:
int getNumber(){
申报表(1);
}
};
B类:公共A{
公众:
int getNumber(){
返回(2);
}
};
int _tmain(int argc,_TCHAR*argv[]
{
A*清单[2];
列表[0]=新的A();
列表[1]=新的B();
std::cout getNumber()x;
返回0;
}

你很接近了,而且你似乎对对象切片非常了解。然而,对象切片并不是在这里发生的——是函数调用本身让你感到悲伤

为了利用多态性,您需要将您的成员函数标记为
virtual

(更准确地说,是为了利用虚拟调度。)


A类{
公众:

virtual int getNumber(){/您很接近了,您似乎对对象切片非常了解。但是,对象切片并没有在这里发生-函数调用本身让您感到悲伤

为了利用多态性,您需要将您的成员函数标记为
virtual

(更准确地说,是为了利用虚拟调度。)


A类{
公众:

virtual int getNumber(){/您很接近了,您似乎对对象切片非常了解。但是,对象切片并没有在这里发生-函数调用本身让您感到悲伤

为了利用多态性,您需要将您的成员函数标记为
virtual

(更准确地说,是为了利用虚拟调度。)


A类{
公众:

virtual int getNumber(){/您很接近了,您似乎对对象切片非常了解。但是,对象切片并没有在这里发生-函数调用本身让您感到悲伤

为了利用多态性,您需要将您的成员函数标记为
virtual

(更准确地说,是为了利用虚拟调度。)


A类{
公众:

virtual int getNumber(){/您在这里没有遇到对象切片。这是的一个示例

基本上,由于
A
B
都有一个函数
getNumber
,但它不是一个虚拟函数,因此没有虚拟函数表来告诉编译器应该调用哪个函数。相反,它将根据类型调用相应的函数(在本例中,
A*


A
中将
getNumber
声明为virtual,这就解决了您的问题:
virtual int getNumber(){…}
您在这里没有遇到对象切片。这是一个示例

基本上,由于
A
B
都有一个函数
getNumber
,但它不是一个虚拟函数,因此没有虚拟函数表来告诉编译器应该调用哪个函数。相反,它将根据类型调用相应的函数(在本例中,
A*


A
中将
getNumber
声明为virtual,这就解决了您的问题:
virtual int getNumber(){…}
您在这里没有遇到对象切片。这是一个示例

基本上,由于
A
B
都有一个函数
getNumber
,但它不是一个虚拟函数,因此没有虚拟函数表来告诉编译器应该调用哪个函数。相反,它将根据类型调用相应的函数(在本例中,
A*


A
中将
getNumber
声明为virtual,这就解决了您的问题:
virtual int getNumber(){…}
您在这里没有遇到对象切片。这是一个示例

基本上,由于
A
B
都有一个函数
getNumber
,但它不是一个虚拟函数,因此没有虚拟函数表来告诉编译器应该调用哪个函数。相反,它将根据类型调用相应的函数(在本例中,
A*


A
中将
getNumber
声明为virtual,这就解决了您的问题:
virtual int getNumber(){…}

程序正在输出
11
,因为
getNumber
函数没有标记为
virtual
。没有
virtual
关键字,指向A
B
A*
不知道在v表中查找函数。因此它只调用
getNumber
函数A

将函数声明为

virtual int getNumber( );
你应该得到预期的行为


阅读更多信息并查看。

程序正在输出
11
,因为
getNumber
函数没有标记为
virtual
。没有
virtual
关键字,指向A
B
A*
不知道如何在v表中查找该函数。因此它只调用
getNumberA的de>功能

将函数声明为

virtual int getNumber( );
你应该得到预期的行为


阅读更多信息并查看。

程序正在输出
11
,因为
getNumber
函数没有标记为
virtual
。没有
virtual
关键字,指向A
B
A*
不知道在v表中查找函数。因此它只调用
getnumbers>
virtual int getNumber( );