C++中的矢量容器和静态绑定
Vector container and static binding in C++?
有人可以解释为什么i->value()
和(i + 1)->value()
打印 1 和 3 而不是像x[0]->value() << x[1]->value()
那样打印 1 和 4
#include <iostream>
#include <vector>
class A
{
public:
A(int n = 0) : m_n(n) { }
public:
virtual int value() const { return m_n; }
virtual ~A() { }
protected:
int m_n;
};
class B
: public A
{
public:
B(int n = 0) : A(n) { }
public:
virtual int value() const { return m_n + 1; }
};
int main()
{
const A a(1); //a.m_n=1
const B b(3); //b.m_n=3
const A *x[2] = { &a, &b };
typedef std::vector<A> V;
V y;
y.push_back(a);
y.push_back(b);
V::const_iterator i = y.begin();
std::cout << x[0]->value() << x[1]->value()
<< i->value() << (i + 1)->value() << std::endl;
return 0;
}
谢谢
y.push_back(b);
创建一个A
的实例,该实例是b
中A
子对象的副本,并将其推送到向量上。向量上没有B
的实例,也不可能有,因此不调用B::value()
。阅读有关对象切片的信息
void push_back (const value_type& val);
如果向量定义为 std::vector<A> V
,则将创建 val
的A
副本。你在这里看到所谓的切片问题。这就是为什么你应该使用
std::vector<A*> V
或
std::vector<shared_ptr<A> > V
相关文章:
- 视觉studo 2019中的漫画和静态/动态绑定
- 在派生类中绑定非静态模板化成员函数
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 将非静态函数绑定到回调时出现问题
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- | 9 |错误:非静态数据成员'matrix :: row'| 9 |错误:数组绑定不是在']']'令牌|之前的整数常数
- 将静态成员函数绑定为回调
- 如何使用泛型在 C# 中将类型静态绑定在一起(如在 TypeToType <T>中)?
- 尽管模板是静态绑定的,但旧代码的对象文件为什么以及如何使用使用通用编程范式的新代码
- 可变长度数组VLA(静态绑定或动态)
- 静态绑定期间C++和 Ada 的差异
- C++中的矢量容器和静态绑定
- 具有静态绑定成员函数指针的可变模板的多个专业化
- C++中数组的静态绑定检查
- 在C++中,动态数组与静态绑定数组有何不同
- c++多态性:为什么即使类型很明显,静态绑定也是不可能的
- 动态绑定、静态绑定和延迟绑定的区别是什么?
- 在C++中,如果成员函数是虚拟的,什么时候可以使用静态绑定