在这种情况下,将派生类传递到具有基类引用arg的函数中,我会得到切片吗?
Do I get sliced for this case of passing derived classes into a function with base class reference arg?
我有以下程序
#include <iostream>
class Animal {
public:
Animal(int age) : age_(age) {}
virtual ~Animal() {}
virtual void vocalize() = 0;
virtual void description() = 0;
protected:
int age_;
};
class Dog : public Animal {
public:
Dog(int age, bool bites) : Animal(age), bites_(bites) {}
virtual ~Dog() {}
virtual void vocalize() {
std::cout << "woff" << std::endl;
}
virtual void description() {
std::cout << "Dog" << std::endl;
std::cout << "age " << age_ << std::endl;
std::cout << "bites " << bites_ << std::endl;
}
private:
bool bites_;
};
class Cat : public Animal {
public:
Cat(int age, bool likes_tuna) : Animal(age), likes_tuna_(likes_tuna) {}
virtual ~Cat() {}
virtual void vocalize() {
std::cout << "meow" << std::endl;
}
virtual void description() {
std::cout << "Cat" << std::endl;
std::cout << "age " << age_ << std::endl;
std::cout << "likes tuna " << likes_tuna_ << std::endl;
}
private:
bool likes_tuna_;
};
int doStuff(Animal &animal) {
animal.description();
animal.vocalize();
}
int main() {
Dog d(3, false);
Cat c(5, true);
doStuff(d);
doStuff(c);
}
正如您所看到的,当我调用doStuff时,我将派生类传递给绑定到基类引用,然后调用一个纯虚方法,并由每个派生类重新实现。其中一个方法(description)同时使用基类(age_)和派生类(如es_tuna_和bites_)上的成员变量。我是被切了还是合法的?
我是被切了还是合法的?
。你是不是得到切片。
多态性需要引用或指针,在本例中,您使用的是前者。这很好。你不是通过值传递参数给你的函数,而是通过引用,这就是允许对Animal
的引用(doStuff()
的参数)绑定到一个对象,其实际类型是Animal
的子类。
切片:
Animal a; // Pretend Animal is not abstract...
Dog d;
a = d; // Slicing!
Animal& a1 = d; // No slicing!
Animal* pA = &d; // No slicing!
pA = &a1; // No slicing!
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 专门化模板覆盖函数/避免对象切片
- C++切片和虚拟析构函数
- 返回 am Eigen::来自函数的张量切片
- 缺少复制构造函数与对象切片有何关系
- 正在阻止复制构造函数中的切片
- 如何在我的c++ __getitem__函数中处理切片(由SWIG使用)
- 什么是隐藏切片复制构造函数
- 在这种情况下,将派生类传递到具有基类引用arg的函数中,我会得到切片吗?