我有一个A类:
class A
{
public:
virtual double getValue() = 0;
}
Run Code Online (Sandbox Code Playgroud)
和B级:
class B : public A
{
public:
virtual double getValue() { return 0.0; }
}
Run Code Online (Sandbox Code Playgroud)
然后在main()中我做:
A * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //This, or any other index besides 0, causes the program to quit
Run Code Online (Sandbox Code Playgroud)
如果相反,我做:
B * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //Everything else works fine too
Run Code Online (Sandbox Code Playgroud)
一切都很好,但好像我的多态性似乎有些不对劲?我很困惑.
我在网站上找到了这段代码
#include <iostream>
using namespace std;
struct Base
{
Base() { cout << "Base" << " "; }
virtual ~Base() { cout << "~Base" << endl; }
int i;
};
struct Der : public Base
{
Der() { cout << "Der" << endl; }
virtual ~Der() { cout << "~Der" << " "; }
int it[10]; // sizeof(Base) != sizeof(Der)
};
int main()
{
Base *bp = new Der;
Base *bq = new Der[5];
delete bp;
delete [] …Run Code Online (Sandbox Code Playgroud) c++ polymorphism segmentation-fault new-operator virtual-destructor
当我分配单个对象时,此代码工作正常.当我尝试添加数组语法时,会出现段错误.为什么是这样?我的目标是向外界隐瞒类c在内部使用b对象的事实.我已将程序发布到键盘供您使用.
#include <iostream>
using namespace std;
// file 1
class a
{
public:
virtual void m() { }
virtual ~a() { }
};
// file 2
class b : public a
{
int x;
public:
void m() { cout << "b!\n"; }
};
// file 3
class c : public a
{
a *s;
public:
// PROBLEMATIC SECTION
c() { s = new b[10]; } // s = new b;
void m() { for(int i = 0; i …Run Code Online (Sandbox Code Playgroud)
首先看一下下面的代码(在这个代码形状中是基类,而行是派生类)
void drawshapes(shape sarray[],int size)
{
for(int i=0;i< size; i++)
sarray[i].draw();
}
main()
{
line larray[10];
larray[0]=line(p1,p2);//assuming that we have a point class
larray[1]=line(p2,p3);
..........
drawshapes(larray,10);
}
Run Code Online (Sandbox Code Playgroud)
当我们编译这个程序时,首先会调用shape的draw方法,然后程序终止.为什么它会终止?为什么我们不能在没有基类指针或引用的情况下实现多态性这是什么技术原因?如果我们试图用对象数组实现多态,那么编译器会做什么?请用例子以可理解的方式解释.我会非常感激的.