C++ 调用基类';带基类指针的s值构造函数?

C++ 调用基类';带基类指针的s值构造函数?,c++,inheritance,constructor,C++,Inheritance,Constructor,基类有一个接受参数的值构造函数。它没有默认构造函数 下面使用一个base类指针,它将该指针设置为堆上某个派生的类对象的地址。这将显式调用派生的的值构造函数。有没有办法在此行中显式调用base的值构造函数?我知道另一种方法是,可以让派生类构造函数调用基类构造函数 base*ptr=新派生(args)您可以在行中显式调用base的值构造函数,如下所示(但请注意,参数列表有所不同) #包括 阶级基础{ 公众: 基(int ARG){STD::CutONO,C++不这样工作。只有派生类的构造函数调用基类

基类有一个接受参数的值构造函数。它没有默认构造函数

下面使用一个
base
类指针,它将该指针设置为堆上某个
派生的
类对象的地址。这将显式调用
派生的
的值构造函数。有没有办法在此行中显式调用
base
的值构造函数?我知道另一种方法是,可以让派生类构造函数调用基类构造函数


base*ptr=新派生(args)

您可以在行中显式调用
base
的值构造函数,如下所示(但请注意,参数列表有所不同)

#包括
阶级基础{
公众:

基(int ARG){STD::CutONO,C++不这样工作。只有派生类的构造函数调用基类的构造函数。“替代”SamVarshavchik说,我认为他可以通过C++使用.<代码:使用Base::Basic;< /Cord>。但是这里的两个构造函数有一个ARG,所以一个新的歧义。@ ASMMO,在这种情况下,如果构造函数完全相同,则派生构造函数仍然隐藏基元。(对成员函数使用声明的工作方式与使用声明阻止作用域的工作方式不同)有趣的是,如果
派生
构造函数的参数都是
int a
,程序将如何决定调用哪一个?您是否能够明确地告诉程序调用哪一个?@TEDLYNMO OP似乎在要求动态allocation@David如果
派生
产生重载w使用相同的签名,这将隐藏基类中的函数,因此如果实例化
派生的
,它将使用
派生的
的构造函数。@TEDLYGMO是的,这是个好主意。(顺便说一句,删除基指针是未定义的行为,否则,不一定“只调用基类析构函数”).对不起,我只想用@TEDLYNMO介绍

   #include<iostream>

    class Base{

    public:
        Base(int arg){std::cout<<"\nBase constructor";}
        Base()=default;
        virtual ~Base(){}
    };

    class Derived:public Base{
    public:
        Derived(double arg){
            std::cout<<"\nDerived constructor";
        }
        using Base::Base;//This is the key for the answer

    };


    int main(){

        Base* derivedPtr1 {new Derived{0.2}};//calls derived ctor
        Base* derivedPtr2 {new Derived{2}};//calls base ctor
        delete derivedPtr2;
        delete derivedPtr1;

    }
#include<iostream>

class Base{

public:
    Base(int arg){std::cout<<"\nBase constructor";}
    virtual ~Base(){}

};

class Derived:public Base{
int k{};
public:
    Derived(double arg):Base(2){
        std::cout<<"\nDerived constructor";
    }
    using Base::Base;
    Derived()=default;
    ~Derived(){std::cout<<"\nDerived destructor";}

};


int main(){

    Base* derivedPtr1 {new Derived{0.2}};
    Base* derivedPtr2 {new Derived{2}};
    delete derivedPtr2;
    delete derivedPtr1;

}