C++ のスライシングの問題について読み、いくつかの例を試しました (私は Java のバックグラウンドを持っています)。残念ながら、私はいくつかの動作を理解していません。現在、私はこの例 (Efficent C++ Third Edition の別の例) に行き詰まっています。誰かがそれを理解するのを手伝ってくれますか?
親の私の単純なクラス:
class Parent
{
public:
Parent(int type) { _type = type; }
virtual std::string getName() { return "Parent"; }
int getType() { return _type; }
private:
int _type;
};
子の私の単純なクラス:
class Child : public Parent
{
public:
Child(void) : Parent(2) {};
virtual std::string getName() { return "Child"; }
std::string extraString() { return "Child extra string"; }
};
メイン:
void printNames(Parent p)
{
std::cout << "Name: " << p.getName() << std::endl;
if (p.getType() == 2)
{
Child & c = static_cast<Child&>(p);
std::cout << "Extra: " << c.extraString() << std::endl;
std::cout << "Name after cast: " << c.getName() << std::endl;
}
}
int main()
{
Parent p(1);
Child c;
printNames(p);
printNames(c);
}
実行後、次のようになります。
名前: 親
名前: 親
おまけ:子増し紐
キャスト後の名前:親
それが「スライス」の原因であるため、最初の2行は理解しています。しかし、静的キャストを介して子を親にキャストできる理由がわかりません。本には、スライスした後、すべての専門的な情報がスライスされると書かれています。したがって、情報がないため、 pをcにキャストできないと思います(関数 printNames の先頭で、追加情報なしで新しい Parent オブジェクトが作成されます)。
さらに、「キャスト後の名前: 子」ではなく、キャストが成功した場合に「キャスト後の名前: 親」が表示されるのはなぜですか?