スライスを理解した後、私はそれが動的変数へのポインタを使用して壊れることがあることを理解しています。しかしどうして?なぜその時点でスライスしていないのですか?私は自分自身だと思うが、私はよく分からない。 ppet = pdog;
割り当ての後、pdogはppetの同じアドレスを指します。それじゃない?仮想関数とポインタの使い方を理解する
//Program to illustrate use of a virtual function
//to defeat the slicing problem.
#include <string>
#include <iostream>
using namespace std;
class Pet
{
public:
virtual void print();
string name;
};
class Dog : public Pet
{
public:
virtual void print();//Keyword virtual not needed, but put
//here for clarity. (It is also good style!)
string breed;
};
int main()
{
Dog vdog;
Pet vpet;
vdog.name = "Tiny";
vdog.breed = "Great Dane";
vpet = vdog;
//vpet.breed; is illegal since class Pet has no member named breed
Dog *pdog;
pdog = new Dog;
pdog->name = "Tiny";
pdog->breed = "Great Dane";
Pet *ppet;
ppet = pdog;
ppet->print(); // These two print the same output:
pdog->print(); // name: Tiny breed: Great Dane
//The following, which accesses member variables directly
//rather than via virtual functions, would produce an error:
//cout << "name: " << ppet->name << " breed: "
// << ppet->breed << endl;
//generates an error message: 'class Pet' has no member
//named 'breed' .
//See Pitfall section "Not Using Virtual Member Functions"
//for more discussion on this.
return 0;
}
void Dog::print()
{
cout << "name: " << name << endl;
cout << "breed: " << breed << endl;
}
void Pet::print()
{
cout << "name: " << endl;//Note no breed mentioned
}
出力:
The slicing problem:
name: Tiny
Note that it was print from Pet that was invoked.
The slicing problem defeated:
name: Tiny
breed: Great Dane
name: Tiny
breed: Great Dane
[OT]:キーワード 'override'は、実際にオーバーライドされているかどうかを確認するので、不要な' virtual'を書き込むよりも優れています。 – Jarod42
私は決してキーワードとしてオーバーライドを聞いたことがなかった。少し説明できますか? @ Jarod42 – askque
http://stackoverflow.com/questions/13880205/override-in-c11 – user007