[英]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.