簡體   English   中英

重載繼承的可變參數模板成員 function

[英]Overloading inherited variadic template member function

我正在嘗試在子 class 中重載父類的可變參數模板成員 function 但我在使其正常工作時遇到了一些問題。

考慮以下代碼:

#include <iostream>
#include <string>

class base {
public:
   base() {}
   template<typename... Args>
      void test(Args... args) {
         std::cout<<__PRETTY_FUNCTION__<<std::endl;
      }
};

class child : public base {
public:
   child() {}
   template<typename... Args>
      void test(Args... args) {
         std::cout<<__PRETTY_FUNCTION__<<std::endl;
      }
};


int main(int, char**)
{
   base* b = new base;
   base* c = new child;

   b->test(1);
   c->test(1);
   b->test(1, 1.2, "test");
   c->test(1, 1.2, "test");
   b->test("test", std::string("string"));
   c->test("test", std::string("string"));

   return 0;
}

當我運行它時,我得到 output

void base::test(Args ...) [with Args = {int}]
void base::test(Args ...) [with Args = {int}]
void base::test(Args ...) [with Args = {int, double, const char*}]
void base::test(Args ...) [with Args = {int, double, const char*}]
void base::test(Args ...) [with Args = {const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]
void base::test(Args ...) [with Args = {const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]

只有當我改變base* c = new child; child* c = new child; 我是否得到了我想要/期望的 output:

void base::test(Args ...) [with Args = {int}]
void child::test(Args ...) [with Args = {int}]
void base::test(Args ...) [with Args = {int, double, const char*}]
void child::test(Args ...) [with Args = {int, double, const char*}]
void base::test(Args ...) [with Args = {const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]
void child::test(Args ...) [with Args = {const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]

我在這里做錯了什么/我不明白嗎? 我認為多態性將允許我使用向下轉換指針,並且仍然能夠訪問子 class 的功能。

您正試圖在沒有多態性的地方利用多態性。 為了使 class 具有多態性(如從指向基類的指針/引用調用 function 的派生實現),必須將成員 function 標記為虛擬。 然而,這不能使用 C++ 中的 function 模板來完成。 對不起。

您的第二個示例有效,因為它不嘗試任何多態性,而是在編譯時知道 object 的真實類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM