class Base1
{
private:
int testInput;
public:
Base1();
virtual int GetRow(void) = 0;
};
Base1::Base1()
{
testInput = 0;
}
class table : public Base1
{
private:
int row;
public:
table();
virtual int GetRow(void);
};
table::table()
{
//Contructor
row = 5;
}
int table::GetRow()
{
return row;
}
int main()
{
Base1* pBase = new table[3];
pBase[0].GetRow();
pBase[1].GetRow(); //when i get to this line, the compiler keep saying access
// violation.
pBase[2].GetRow();
return 0;
}
Próbuję utworzyć tablicę 3 klas tabeli. Warunkiem jest to, że muszę użyć obiektu Base, aby to zrobić.Jak stworzyć tablicę z polimorfizmem w C++?
Base1 * pBase = new table[3];
dobrze mi wygląda. Ale kiedy próbowałem uzyskać dostęp do każdej tabeli, kompilator powiedział, że to naruszenie zasad dostępu. Nie wiem, co jest złego w tym kodzie. Korzystam jednak z Visual Studio 2010.
i, shhh .. ale rzucenie do właściwego typu, a następnie wywołanie metody na rzuconym typie zapobiegnie katastrofie – johnathon
Masz na myśli '((tabela) pBase) [1] .GetRow()'? To zadziała, ale jest to * okropne * i prawie na pewno wróci i ugryzie cię w dupę. –
tak, mam na myśli właśnie to. Tak, jest to dość "okropne", ale jest to całkiem słuszny sposób, aby przekonać kompilator do uzyskania dostępu do obiektów polimorficznych pod prawidłowymi adresami. – johnathon