C++ 不理解多态函数
我试图创建一个对象数组,其类“全部继承自基类”。因为我在使用Python之后刚刚学习C++,这是我第一次遇到对象切片。从我所读到的内容来看,我应该使用指向对象的指针,而不是对象本身的实例,但我似乎无法让它工作 例如,为什么此程序会输出: 1. 1. 而不是: 1. 二,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
#包括
甲级{
公众:
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
关键字,指向AB
的A*
不知道在v表中查找函数。因此它只调用getNumber
函数A
将函数声明为
virtual int getNumber( );
你应该得到预期的行为
阅读更多信息并查看。程序正在输出11
,因为getNumber
函数没有标记为virtual
。没有virtual
关键字,指向AB
的A*
不知道如何在v表中查找该函数。因此它只调用getNumberA的de>功能
将函数声明为
virtual int getNumber( );
你应该得到预期的行为
阅读更多信息并查看。程序正在输出11
,因为getNumber
函数没有标记为virtual
。没有virtual
关键字,指向AB
的A*
不知道在v表中查找函数。因此它只调用getnumbers>
virtual int getNumber( );