Sau khi tìm hiểu về việc cắt, theo như tôi thấy rằng nó có thể bị hỏng bằng cách sử dụng con trỏ đến các biến động. Nhưng làm thế nào đến? Tại sao không có cắt tại điểm đó? Tôi nghĩ bản thân mình nhưng tôi không chắc chắn. Sau khi chuyển nhượng ppet = pdog;
, điểm pdog đến cùng một địa chỉ của ppet. Phải không?tìm hiểu cách sử dụng chức năng ảo và cách sử dụng con trỏ
//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
}
Output:
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]: từ khóa 'ghi đè' thậm chí còn tốt hơn viết 'ảo' không cần thiết vì nó kiểm tra xem nó có thực sự là ghi đè hay không. – Jarod42
Tôi chưa bao giờ nghe nói ghi đè là từ khóa. Bạn có thể giải thích một chút? @ Jarod42 – askque
http://stackoverflow.com/questions/13880205/override-in-c11 – user007