首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++如何将std :: vector <Derived*>类型的指针设置为std :: vector <Base*>类型的对象

首先,我们需要了解C++中的多态性和虚函数。在C++中,可以通过将基类指针指向派生类对象来实现多态性。为了实现这一点,需要在基类中声明虚函数。

以下是一个简单的示例,说明如何将std::vector<Derived>类型的指针设置为std::vector<Base>类型的对象:

代码语言:cpp
复制
#include<iostream>
#include<vector>

class Base {
public:
    virtual void print() {
        std::cout << "Base class print function"<< std::endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived class print function"<< std::endl;
    }
};

int main() {
    std::vector<Base*> base_vector;
    std::vector<Derived*> derived_vector;

    Base* base_ptr = new Base();
    Derived* derived_ptr = new Derived();

    base_vector.push_back(base_ptr);
    derived_vector.push_back(derived_ptr);

    // 将std::vector<Derived*>类型的指针设置为std::vector<Base*>类型的对象
    for (auto ptr : derived_vector) {
        base_vector.push_back(ptr);
    }

    // 调用基类和派生类的print函数
    for (auto ptr : base_vector) {
        ptr->print();
    }

    // 释放内存
    for (auto ptr : base_vector) {
        delete ptr;
    }

    return 0;
}

在这个示例中,我们首先创建了两个向量:一个基类向量和一个派生类向量。然后,我们创建了两个指针,一个指向基类对象,另一个指向派生类对象。接下来,我们将基类指针添加到基类向量中,将派生类指针添加到派生类向量中。

接下来,我们将派生类向量中的指针设置为基类向量的对象。这是通过遍历派生类向量并将每个指针添加到基类向量中来实现的。

最后,我们遍历基类向量并调用每个对象的print函数。在这个例子中,我们可以看到基类和派生类的print函数都被调用了,这就是多态性的体现。

请注意,这个示例仅用于演示目的,实际应用中可能需要更复杂的数据结构和算法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Effective C++:规定27:尽量少做动作过渡

C++中唯一能做此操作转型操作符。 (2)dynamic_cast(expression):主要用来运行“安全向下转型”,即用来决定某对象是否归属继承体系中某个类型。...(static_cast(15));//c++风格转型动作创建一个Widget对象 (五)先看以下这个代码: class Base{...}; class Derived : public...Base{...}; Derived d; Base* pb = &d;//隐喻derived*转换成Base* 在这里表明:单一对象可能拥有一个以上地址。...这里我们仅仅是建立一个base class指针指向一个derived class对象,但有时候上述两个指针值并不同样。...第一种方法: 使用容器并在当中存储直接指向derived class对象指针(一般是智能指针)如此便消除了“通过base class接口处理对象须要。

23320

Modern c++快速浅析

•但是过量使用auto会导致代码可读性降低;同时由于是编译器自动推导,各种类型忽略问题以及转换问题我们都需要重视以std::vector例,std::vectorstd::...bool类型std::vector result = {true, false, true}; bool value1 = result[0]; // 此时value2被推导std...: private Base { }; Derived d; // 无法访问Base对象 但是在子类中添加了对父类对象using后 class Derived : private Base...(理解能够延长生命周期按引用捕获) 而C++按引用捕获并不能延长对象生命周期,且按引用捕获会导致lambda表达式包含了对局部对象引用,这很可能会导致空悬引用 std::function<void...:C++中不允许void*指针隐式转换为其他指针类型,即下面代码是非法 int* p = (void*)0; nullptr是C++11中一个关键字,它类型std::nullptr_t #ifdef

17010

C++】【期末考】【基本概念和语法】概括总结——期末速成

C++简介 C++历史与发展 C++是一种面向对象编程语言,由Bjarne Stroustrup在20世纪80年代初开发。...C++特点与优势 面向对象编程:支持类和对象、继承、多态和封装。 高效性:C++编译后程序运行速度很快,接近于C语言。 灵活性:支持多范式编程,包括面向对象、泛型编程和过程式编程。...a : b; } 函数重载 C++支持函数重载,即允许多个同名函数根据参数类型或数量不同而存在。...}; class Derived : public Base { public: void show() override { std::cout << "Derived class...Base *b; Derived d; b = &d; b->show(); // 输出"Derived class" 运算符重载 运算符重载允许自定义运算符行为。

9710

字节一面,轻松通过!

() called" << endl; } }; 多态性: 当基类指针或引用指向派生类对象时,通过基类虚函数进行调用时,会根据实际对象类型调用对应函数,这种行为称为多态性。...Base* ptr = new Derived(); ptr->display(); // 调用Derived类中display()函数 虚函数表(vtable) C++ 使用虚函数表(vtable...每个包含虚函数类都有一个对应虚函数表,表中存储了虚函数地址。在运行时,编译器根据对象实际类型查找虚函数表,并调用相应函数。...std::shared_ptr 是 C++11 引入智能指针,用于管理动态分配对象。它允许多个指针共享对同一对象所有权,提供了一种更安全和方便内存管理方式,避免了内存泄漏和悬空指针问题。...std::shared_ptr 是 C++ 中常用智能指针之一,可以帮助管理动态分配资源,避免内存泄漏,并提高代码安全性和可维护性。 5.

16210

C++关键知识点梳理

基本类型基本类型大小随编译器决定,下面以32位类型大小 (字节)bool未定义char1short2int4long4long long8float4double8变量变量初始化,在C++中,使用未初始化变量是一种错误编程行为...static_cast::type&&>(a);}std::forward:如果函数forward实参数据类型是左值引用,则返回类型左值引用...print(const std::vector& data);非常量指针不能指向常量对象const double pi = 3.14double *ptr = π //❌,非常量指针不能指向常量对象顶层指针...,例如,get操作成员函数最好定义常量成员函数;常量对象、常量对象引用或指针都只能调用常量成员函数。...虚析构函数:为了防止delete指向派生类对象基类指针时只调用基类析构函数引起内存泄漏using namespace std;class Base {public: virtual ~ Base

94930

Python & C++ - pybind11 实现解析

方法, 图中左侧大多是 Python 专有的类型, 右侧则大多是能够简单转换为 C++类型Python类型, 以及额外用于对C++指针进行管理 capsule 类型, 这些都继承自 object,...info] C++ 类型查询是通过 RTTI 来实现, 通过对具体类型调用 typeid(CxxClassType) 得到一个 std::type_info 类型对象, 再通过这个对象构造支持哈希和比较..., 可以参考下图: pybind11 使用层次化结构解决类型之间依赖关系, 不同类型一般设置自定义方法是不一样..... - internals::instance_base: C++ 对象基础类型, 从上面的 default_meta_class 继承, 并设置了 tp_new, tp_init, tp_dealloc...不管是不是由 Python 创建持有的, 都将表达一个 pybind11::detail::instance 对象, 所有的 C++ UDT对象都会被类型擦除到 instance, 能够想象, 这个对象在需要时候能够还原为原始

1.3K80

C++:从技术实现角度聊聊RTTI

C++中,由于存在多态行为,基类指针或者引用指向一个派生类,而其指向真正类型,在编译阶段是无法知道Base *b = new Derived; Base &b1 = *b; 在上述代码中,如果想知道...以常用函数typeid().name()举例,int和Base(自定义类)在VS下输出分别为int和Base,而在gcc编译器下,其输出i和4Base,又比如typeid(std::vector)....实现 在前面有提到,typeid()会返回一个const std::type_info&对象,其中存储这对象基本信息,那么如果其类型对象多态和非多态时候,其又有什么区别呢?...我们以Base指针实际指向Derived对象例,vtable for Derived:部分代表着Derived虚函数表内容,其中有一行typeinfo for Derived代表着Derived...const void *origin; }; • whole_object 表示当前指针指向对象偏移量 • whole_type 指向 C++ 对象类型:class(基类

92290

c++11新特性,所有知识点都在这了!

C++线程池实现之格式修订版 C++定时器实现之格式修订版 智能指针 很多人谈到c++,说它特别难,可能有一部分就是因为c++内存管理吧,不像java那样有虚拟机动态管理内存,在程序运行过程中可能就会出现内存泄漏...,然而这种问题其实都可以通过c++11引入智能指针来解决,相反我还认为这种内存管理还是c++语言优势,因为尽在掌握。...c++11引入了三种智能指针std::shared_ptr std::weak_ptr std::unique_ptr 详细介绍请看:c++11新特性之智能指针 基于范围for循环 直接看代码 vector...nullptr nullptr是c++11用来表示空指针新引入常量值,在c++中如果表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型0,其实不是个指针。...char *const ptr; // 指针本身是常量 const char* ptr; // 指针指向变量常量 在函数参数中使用const,一般会传递类对象时会传递一个const引用或者指针,这样可以避免对象拷贝

18.5K23

【优选算法】滑动窗口——leetcode——438.找到字符串中所有字母异位词

优化:更新结果判断条件 利用变化量count来统计窗口中“有效字符次数”; 当窗⼝中每种字⺟数量与字符串p中每种字⺟数量相同时,则说明当前窗⼝字符串 p 异位词; 4.编程代码 C++...成员函数与类 概述:类是 C++ 基本面向对象编程(OOP)结构,用于封装数据和操作数据方法。成员函数是类函数,可以操作类成员数据。...Derived class" << std::endl; } }; int main() { Base* basePtr; Derived derived; basePtr...cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() override...{ std::cout << "Derived class" << std::endl; } }; int main() { Base* basePtr; Derived

8110

从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数

virtual 返回值类型 函数名(参数表) = 0;     }; 纯虚函数不需要实现 二、抽象类 作用 抽象类抽象和设计目的而声明,将有关数据和行为组织在一个继承层次结构中,保证派生类具有要求行为...,并能管理该对象 可以添加新类(已有类派生类)对象,并能管理该对象 四、虚析构函数 析构函数可以声明为虚函数 delete 基类指针; 程序会根据基类指针指向对象类型确定要调用析构函数...基类析构函数虚函数,所有派生类析构函数都是虚函数 构造函数不得是虚函数 如果要操作具有继承关系动态对象,最好使用虚析构函数。...(给出一个空实现即可) class Base { public:     virtual ~Base() = 0     {     } }; class Derived : public Base...{ }; int main(void) {     //  Base b; //error, 抽象类     Derived d;     return 0; } // 对于一个没有任何接口类,

1.3K00

每个C++开发者都应该学习和使用C++11特性

nullptr 是一个关键字,它代表一个空指针,具有明确指针类型,不同于传统 C++ 中使用 NULL 或 0 表示空指针方式。 1. 为什么引入 nullptr?...但这种方式存在一些问题,比如: 在重载函数或者模板中,如果同时存在参数指针类型和整数类型函数,传递 NULL 或 0 可能会导致调用了错误重载版本。...class Base { public: virtual void func(); }; class Derived : public Base { public: void func...class Base { public: virtual void func() final; // 表示禁止派生类重写该虚函数 }; class Derived : public Base...std::vector vec; vec.push_back("example"); // 移动临时对象 在函数返回值中使用: 当函数返回一个临时对象时,可以通过移动语义避免不必要复制

5610

C++知识点

还没有整理过笔记,有点乱 C++ 程序设计 II 兼谈对象模型 Conversion function - 转换函数 operator type() // this type -> other type...(*p & mask)); } ... } pointer-like classes, 关于智能指针 ---- 一个 class 产生出来对象像一个指针(do more then pointer...Base2 {}; class Derived2 {}; pair p; pair p2(p); // 可以 pair<Base1...Component(); Base()} // 与构造相反 关于 vptr 和 vtbl (虚指针和虚表) 只要类中有虚函数,其对象在内存中就会多一根指针(指向虚表) 父类有虚函数,子类对象也一定拥有该指针...但如果符合某些条件就会动态绑定: 通过指针调用 指针向上转型 up-cast 所调用是虚函数(virtual func) 动态绑定形式:虚机制 多态:指针具有很多类型(型态) ---- 关于

86030

【重学C++】04 | 说透C++右值引用(上)

文章首发【重学C++】04 | 说透C++右值引用(上)引言大家好,我是只讲技术干货会玩code,今天是【重学C++第四讲,在前面《03 | 手撸C++智能指针实战教程》中,我们或多或少接触了右值引用和移动一些用法...复制 vs 移动假设有一个自定义类X,该类包含一个指针成员变量,该指针指向另一个自定义类对象。假设O占用了很大内存,创建/复制O对象需要较大成本。...rhs);// 移动构造函数Base(Base&& rhs) noexcept;};class Derived : Base {public:Derived(Derived&& rhs)// wrong...所以,除非明确标识noexcept,C++在很多场景下会慎用移动构造。比较经典场景是std::vector 扩缩容。...欢迎关注,及时收到推送~- END -【往期推荐】01 C++如何进行内存资源管理02 脱离指针陷阱:深入浅出 C++ 智能指针03 手撸C++智能指针实战教程

18700

阅读笔记

未来已来:C++ modules初探 纯虚函数 如果其中一个成员函数使用= 0,那么该函数纯虚函数,继承于存在纯虚函数子类,其必须实现该函数: class Base { public: void...fun() = 0; }; class Derived : public Base { public: void fun() {} } 如果声明一个存在纯虚函数类,那边编译器会报错如下: <...= nullptr; } 智能指针 智能指针可以避免内存泄漏,此处文章较多,可以参考: 智能指针-使用、避坑和实现 一次诡异内存泄漏 显式构造 对于如下这种: class Vector { public...】新特性之CTAD 字面量 如果我们像下面这样写: auto s = "hello"; s会被编译器推导const char*,为了使得其为std::string类型,有以下几种方式: auto s1...在这个语法中,"hello"是字符串字面值,而"s"是用户定义字面量后缀,它将字符串字面值转换为std::string对象

11610

C++高级主题系列篇

主要包括: 异常处理 强制转换 智能指针 auto,decltype lambda表达式 1.异常处理 具体异常情况: 做除法时候除数 0; 用户输入年龄时输入了一个负数; 用 new 运算符动态分配空间时...namespace std; class Base { virtual void func() {} }; class Derived : public...如果对象所属类重载了强制类型转换运算符 T(如 T 是 int、int* 或其他类型名),则 static_cast 也能用来进行对象到 T 类型转换。...2)reinterpret_cast reinterpret_cast 用于: 各种不同类型指针之间、不同类型引用之间以及指针和能容纳指针整数类型之间转换。...C++ 解决办法是:dynamic_cast 在进行引用强制转换时,如果发现转换不安全,就会拋出一个异常,通过处理异常,就能发现不安全转换 3.智能指针 实现原理: 只要将 new 运算符返回指针

44920

QT 中对象系统

C++引入这个机制是为了让程序在运行时能根据基类指针或引用来获得该指针或引用所指对象实际类型。 为什么需要在运行时根据基类指针或引用来获得实际所指对象类型呢?...这又牵扯到面向对象编程中多态。 C++多态是指通过一个基类指针或引用调用一个虚函数时,会根据具体对象类型来调用该虚函数不同实现。这样可以实现对象通信和转换,以及多态行为和表现。...举个例子: #include #include using namespace std; class Animal { public: virtual...例如,下面的代码可以将一个基类指针转换为一个派生类指针: class Base { public: virtual ~Base() {} // virtual destructor }; class...Derived : public Base { public: void foo() { ... } // derived class method }; Base *pb = new Derived

31410

现代C++之万能引用、完美转发、引用折叠(万字长文)

临时对象生命周期C++ 规则是:一个临时对象 会在包含这个临时对象完整表达式估值完成后、按生成顺序逆序被销毁,除非有生命周期延长发生。...cout << "~Base()" << endl; } }; class Derived : public Base { public: Derived() { cout...*b1 = new Derived; delete b1; cout<<endl; Derived d; Base &b2 =d; 输出: Base() Derived() ~Base() Base...() Derived() ~Derived() ~Base() 大家可以发现,当把子类绑定到基类时候,子类析构正常了,这便是生命周期延长应用。...在C++ 里,所有的原生类型、枚举、结构、联合、类都代表值类型,只有引用(&)和指针(*)才是引用类型。在 Java 里,数字等原生类型是值类型,类则属于引用类型

6.5K21
领券